From: Rosy Song Date: Fri, 3 Aug 2018 04:16:39 +0000 (+0800) Subject: luci-app-nft-qos: add new application X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=refs%2Fpull%2F1855%2Fhead;p=project%2Fluci.git luci-app-nft-qos: add new application This application is for nft-qos package. Signed-off-by: Rosy Song --- diff --git a/applications/luci-app-nft-qos/Makefile b/applications/luci-app-nft-qos/Makefile new file mode 100644 index 0000000000..01de879937 --- /dev/null +++ b/applications/luci-app-nft-qos/Makefile @@ -0,0 +1,14 @@ +# +# 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:=Qos over Nftables +LUCI_DEPENDS:=+nft-qos + +include ../../luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/applications/luci-app-nft-qos/luasrc/controller/nft-qos.lua b/applications/luci-app-nft-qos/luasrc/controller/nft-qos.lua new file mode 100644 index 0000000000..42043505dc --- /dev/null +++ b/applications/luci-app-nft-qos/luasrc/controller/nft-qos.lua @@ -0,0 +1,51 @@ +-- Copyright 2018 Rosy Song +-- Licensed to the public under the Apache License 2.0. + +module("luci.controller.nft-qos", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/nft-qos") then + return + end + + entry({"admin", "status", "realtime", "rate"}, + template("nft-qos/rate"), _("Rate"), 5).leaf = true + entry({"admin", "status", "realtime", "rate_status"}, + call("action_rate")).leaf = true + entry({"admin", "services", "nft-qos"}, cbi("nft-qos/nft-qos"), + _("Qos over Nftables"), 60) +end + +function _action_rate(rv, n) + local c = io.popen("nft list chain inet nft-qos-monitor " .. n .. " 2>/dev/null") + if c then + for l in c:lines() do + local _, i, p, b = l:match('^%s+ip ([^%s]+) ([^%s]+) counter packets (%d+) bytes (%d+)') + if i and p and b then + -- handle expression + local r = { + rule = { + family = "inet", + table = "nft-qos-monitor", + chain = n, + handle = 0, + expr = { + { match = { right = i } }, + { counter = { packets = p, bytes = b } } + } + } + } + rv[#rv + 1] = r + end + end + c:close() + end +end + +function action_rate() + luci.http.prepare_content("application/json") + local data = { nftables = {} } + _action_rate(data.nftables, "upload") + _action_rate(data.nftables, "download") + luci.http.write_json(data) +end diff --git a/applications/luci-app-nft-qos/luasrc/model/cbi/nft-qos/nft-qos.lua b/applications/luci-app-nft-qos/luasrc/model/cbi/nft-qos/nft-qos.lua new file mode 100644 index 0000000000..61a6d76a7d --- /dev/null +++ b/applications/luci-app-nft-qos/luasrc/model/cbi/nft-qos/nft-qos.lua @@ -0,0 +1,229 @@ +-- Copyright 2018 Rosy Song +-- Licensed to the public under the Apache License 2.0. + +local uci = require("luci.model.uci").cursor() +local wa = require("luci.tools.webadmin") +local fs = require("nixio.fs") +local ipc = require("luci.ip") + +local def_rate_dl = uci:get("nft-qos", "default", "static_rate_dl") +local def_rate_ul = uci:get("nft-qos", "default", "static_rate_ul") +local def_unit_dl = uci:get("nft-qos", "default", "static_unit_dl") +local def_unit_ul = uci:get("nft-qos", "default", "static_unit_ul") + +local def_up = uci:get("nft-qos", "default", "dynamic_bw_up") +local def_down = uci:get("nft-qos", "default", "dynamic_bw_down") + +local limit_enable = uci:get("nft-qos", "default", "limit_enable") +local limit_type = uci:get("nft-qos", "default", "limit_type") +local enable_priority = uci:get("nft-qos", "default", "priority_enable") + +local has_ipv6 = fs.access("/proc/net/ipv6_route") + +m = Map("nft-qos", translate("Qos over Nftables")) + +-- +-- Taboptions +-- +s = m:section(TypedSection, "default", translate("NFT-QoS Settings")) +s.addremove = false +s.anonymous = true + +s:tab("limit", "Limit Rate") +s:tab("priority", "Traffic Priority") + +-- +-- Static +-- +o = s:taboption("limit", Flag, "limit_enable", translate("Limit Enable"), translate("Enable Limit Rate Feature")) +o.default = limit_enable or o.enabled +o.rmempty = false + +o = s:taboption("limit", ListValue, "limit_type", translate("Limit Type"), translate("Type of Limit Rate")) +o.default = limit_static or "static" +o:depends("limit_enable","1") +o:value("static", "Static") +o:value("dynamic", "Dynamic") + +o = s:taboption("limit", Value, "static_rate_dl", translate("Default Download Rate"), translate("Default value for download rate")) +o.datatype = "uinteger" +o.default = def_rate_dl or '50' +o:depends("limit_type","static") + +o = s:taboption("limit", ListValue, "static_unit_dl", translate("Default Download Unit"), translate("Default unit for download rate")) +o.default = def_unit_dl or "kbytes" +o:depends("limit_type","static") +o:value("bytes", "Bytes/s") +o:value("kbytes", "KBytes/s") +o:value("mbytes", "MBytes/s") + +o = s:taboption("limit", Value, "static_rate_ul", translate("Default Upload Rate"), translate("Default value for upload rate")) +o.datatype = "uinteger" +o.default = def_rate_ul or '50' +o:depends("limit_type","static") + +o = s:taboption("limit", ListValue, "static_unit_ul", translate("Default Upload Unit"), translate("Default unit for upload rate")) +o.default = def_unit_ul or "kbytes" +o:depends("limit_type","static") +o:value("bytes", "Bytes/s") +o:value("kbytes", "KBytes/s") +o:value("mbytes", "MBytes/s") + +-- +-- Dynamic +-- +o = s:taboption("limit", Value, "dynamic_bw_down", translate("Download Bandwidth (Mbps)"), translate("Default value for download bandwidth")) +o.default = def_up or '100' +o.datatype = "uinteger" +o:depends("limit_type","dynamic") + +o = s:taboption("limit", Value, "dynamic_bw_up", translate("Upload Bandwidth (Mbps)"), translate("Default value for upload bandwidth")) +o.default = def_down or '100' +o.datatype = "uinteger" +o:depends("limit_type","dynamic") + +o = s:taboption("limit", Value, "dynamic_cidr", translate("Target Network (IPv4/MASK)"), translate("Network to be apply, e.g. 192.168.1.0/24, 10.2.0.0/16, etc")) +o.datatype = "cidr4" +ipc.routes({ family = 4, type = 1 }, function(rt) o.default = rt.dest end) +o:depends("limit_type","dynamic") + +if has_ipv6 then + o = s:taboption("limit", Value, "dynamic_cidr6", translate("Target Network6 (IPv6/MASK)"), translate("Network to be apply, e.g. AAAA::BBBB/64, CCCC::1/128, etc")) + o.datatype = "cidr6" + o:depends("limit_type","dynamic") +end + +o = s:taboption("limit", DynamicList, "limit_whitelist", translate("White List for Limit Rate")) +o.datatype = "ipaddr" +o:depends("limit_enable","1") + +-- +-- Priority +-- +o = s:taboption("priority", Flag, "priority_enable", translate("Enable Traffic Priority"), translate("Enable this feature")) +o.default = enable_priority or o.enabled +o.rmempty = false + +o = s:taboption("priority", ListValue, "priority_netdev", translate("Default Network Interface"), translate("Network Interface for Traffic Shaping, e.g. br-lan, eth0.1, eth0, etc")) +o:depends("priority_enable", "1") +wa.cbi_add_networks(o) + +-- +-- Static Limit Rate - Download Rate +-- +if limit_enable == "1" and limit_type == "static" then + +x = m:section(TypedSection, "download", translate("Static QoS-Download Rate")) +x.anonymous = true +x.addremove = true +x.template = "cbi/tblsection" + +o = x:option(Value, "hostname", translate("Hostname")) +o.datatype = "hostname" +o.default = 'undefined' + +if has_ipv6 then + o = x:option(Value, "ipaddr", translate("IP Address(V4 / V6)")) +else + o = x:option(Value, "ipaddr", translate("IP Address(V4 Only)")) +end +o.datatype = "ipaddr" +if nixio.fs.access("/tmp/dhcp.leases") or nixio.fs.access("/var/dhcp6.leases") then + o.titleref = luci.dispatcher.build_url("admin", "status", "overview") +end + +o = x:option(Value, "macaddr", translate("MAC (optional)")) +o.rmempty = true +o.datatype = "macaddr" + +o = x:option(Value, "rate", translate("Rate")) +o.default = def_rate_dl or '50' +o.size = 4 +o.datatype = "uinteger" + +o = x:option(ListValue, "unit", translate("Unit")) +o.default = def_unit_dl or "kbytes" +o:value("bytes", "Bytes/s") +o:value("kbytes", "KBytes/s") +o:value("mbytes", "MBytes/s") + +-- +-- Static Limit Rate - Upload Rate +-- +y = m:section(TypedSection, "upload", translate("Static QoS-Upload Rate")) +y.anonymous = true +y.addremove = true +y.template = "cbi/tblsection" + +o = y:option(Value, "hostname", translate("Hostname")) +o.datatype = "hostname" +o.default = 'undefined' + +if has_ipv6 then + o = y:option(Value, "ipaddr", translate("IP Address(V4 / V6)")) +else + o = y:option(Value, "ipaddr", translate("IP Address(V4 Only)")) +end +o.datatype = "ipaddr" +if nixio.fs.access("/tmp/dhcp.leases") or nixio.fs.access("/var/dhcp6.leases") then + o.titleref = luci.dispatcher.build_url("admin", "status", "overview") +end + +o = y:option(Value, "macaddr", translate("MAC (optional)")) +o.rmempty = true +o.datatype = "macaddr" + +o = y:option(Value, "rate", translate("Rate")) +o.default = def_rate_ul or '50' +o.size = 4 +o.datatype = "uinteger" + +o = y:option(ListValue, "unit", translate("Unit")) +o.default = def_unit_ul or "kbytes" +o:value("bytes", "Bytes/s") +o:value("kbytes", "KBytes/s") +o:value("mbytes", "MBytes/s") + +end + +-- +-- Traffic Priority Settings +-- +if enable_priority == "1" then + +s = m:section(TypedSection, "priority", translate("Traffic Priority Settings")) +s.anonymous = true +s.addremove = true +s.template = "cbi/tblsection" + +o = s:option(ListValue, "protocol", translate("Protocol")) +o.default = "tcp" +o:value("tcp", "TCP") +o:value("udp", "UDP") +o:value("udplite", "UDP-Lite") +o:value("sctp", "SCTP") +o:value("dccp", "DCCP") + +o = s:option(ListValue, "priority", translate("Priority")) +o.default = "1" +o:value("-400", "1") +o:value("-300", "2") +o:value("-225", "3") +o:value("-200", "4") +o:value("-150", "5") +o:value("-100", "6") +o:value("0", "7") +o:value("50", "8") +o:value("100", "9") +o:value("225", "10") +o:value("300", "11") + +o = s:option(Value, "service", translate("Service"), translate("e.g. https, 23, (separator is comma)")) +o.default = '?' + +o = s:option(Value, "comment", translate("Comment")) +o.default = '?' + +end + +return m diff --git a/applications/luci-app-nft-qos/luasrc/view/nft-qos/rate.htm b/applications/luci-app-nft-qos/luasrc/view/nft-qos/rate.htm new file mode 100644 index 0000000000..5f9cb57d20 --- /dev/null +++ b/applications/luci-app-nft-qos/luasrc/view/nft-qos/rate.htm @@ -0,0 +1,167 @@ +<%# + Copyright 2018 Rosy Song + Licensed to the public under the Apache License 2.0. +-%> + +<%+header%> + + + +

<%:Realtime Rate%>

+ +
<%:This page gives an overview over currently download/upload rate.%>
+ +
+ <%:Realtime Download Rate%> +
+
+
+
<%:IP Address%>
+
<%:Download Rate%>
+
<%:Bytes Total%>
+
<%:Packets Total%>
+
+
+
+ <%:Collecting data...%> +
+
+
+
+
+ +
+ <%:Realtime Upload Rate%> +
+
+
+
<%:IP Address%>
+
<%:Upload Rate%>
+
<%:Bytes Total%>
+
<%:Packets Total%>
+
+
+
+ <%:Collecting data...%> +
+
+
+
+
+ +<%+footer%> diff --git a/applications/luci-app-nft-qos/po/templates/nft-qos.pot b/applications/luci-app-nft-qos/po/templates/nft-qos.pot new file mode 100644 index 0000000000..b6f105461a --- /dev/null +++ b/applications/luci-app-nft-qos/po/templates/nft-qos.pot @@ -0,0 +1,161 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +msgid "Bytes Total" +msgstr "" + +msgid "Collecting data..." +msgstr "" + +msgid "Comment" +msgstr "" + +msgid "Default Download Rate" +msgstr "" + +msgid "Default Download Unit" +msgstr "" + +msgid "Default Network Interface" +msgstr "" + +msgid "Default Upload Rate" +msgstr "" + +msgid "Default Upload Unit" +msgstr "" + +msgid "Default unit for download rate" +msgstr "" + +msgid "Default unit for upload rate" +msgstr "" + +msgid "Default value for download bandwidth" +msgstr "" + +msgid "Default value for download rate" +msgstr "" + +msgid "Default value for upload bandwidth" +msgstr "" + +msgid "Default value for upload rate" +msgstr "" + +msgid "Download Bandwidth (Mbps)" +msgstr "" + +msgid "Download Rate" +msgstr "" + +msgid "Dynamic Rate Limit" +msgstr "" + +msgid "Enable Limit Rate Feature" +msgstr "" + +msgid "Enable Traffic Priority" +msgstr "" + +msgid "Enable this feature" +msgstr "" + +msgid "Hostname" +msgstr "" + +msgid "IP Address" +msgstr "" + +msgid "Limit Enable" +msgstr "" + +msgid "Limit Type" +msgstr "" + +msgid "MAC (optional)" +msgstr "" + +msgid "MB" +msgstr "" + +msgid "NFT-QoS Settings" +msgstr "" + +msgid "Network Interface for Traffic Shaping, e.g. br-lan, eth0.1, eth0, etc" +msgstr "" + +msgid "Network to be apply, e.g. 192.168.1.0/24, 10.2.0.0/16, etc" +msgstr "" + +msgid "Network to be apply, e.g. AAAA::BBBB/64, CCCC::1/128, etc" +msgstr "" + +msgid "No information available" +msgstr "" + +msgid "Packets Total" +msgstr "" + +msgid "Priority" +msgstr "" + +msgid "Protocol" +msgstr "" + +msgid "Qos over Nftables" +msgstr "" + +msgid "Rate" +msgstr "" + +msgid "Rate Limit" +msgstr "" + +msgid "Realtime Rate" +msgstr "" + +msgid "Service" +msgstr "" + +msgid "Static QoS-Download Rate" +msgstr "" + +msgid "Static QoS-Upload Rate" +msgstr "" + +msgid "Target Network (IPv4/MASK)" +msgstr "" + +msgid "Target Network6 (IPv6/MASK)" +msgstr "" + +msgid "This page gives an overview over currently download/upload rate." +msgstr "" + +msgid "Traffic Priority" +msgstr "" + +msgid "Traffic Priority Settings" +msgstr "" + +msgid "Type of Limit Rate" +msgstr "" + +msgid "Unit" +msgstr "" + +msgid "Upload Bandwidth (Mbps)" +msgstr "" + +msgid "Upload Rate" +msgstr "" + +msgid "White List for Limit Rate" +msgstr "" + +msgid "e.g. https, 23, (separator is comma)" +msgstr "" + +msgid "kB" +msgstr "" diff --git a/applications/luci-app-nft-qos/po/templates/zh_CN.mo b/applications/luci-app-nft-qos/po/templates/zh_CN.mo new file mode 100644 index 0000000000..8021277956 Binary files /dev/null and b/applications/luci-app-nft-qos/po/templates/zh_CN.mo differ diff --git a/applications/luci-app-nft-qos/po/templates/zh_CN.po b/applications/luci-app-nft-qos/po/templates/zh_CN.po new file mode 100644 index 0000000000..6914e619f7 --- /dev/null +++ b/applications/luci-app-nft-qos/po/templates/zh_CN.po @@ -0,0 +1,172 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.7\n" +"Last-Translator: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Language: zh_CN\n" + +msgid "Bytes Total" +msgstr "字节总数" + +msgid "Collecting data..." +msgstr "正在收集数据" + +msgid "Comment" +msgstr "注释" + +msgid "Default Download Rate" +msgstr "默认下载速率" + +msgid "Default Download Unit" +msgstr "默认下载速率单位" + +msgid "Default Network Interface" +msgstr "默认网络接口" + +msgid "Default Upload Rate" +msgstr "默认上传速率" + +msgid "Default Upload Unit" +msgstr "默认上传速率单位" + +msgid "Default unit for download rate" +msgstr "默认的下载速率单位" + +msgid "Default unit for upload rate" +msgstr "默认的上传速率单位" + +msgid "Default value for download bandwidth" +msgstr "下载带宽的默认值" + +msgid "Default value for download rate" +msgstr "下载速率的默认值" + +msgid "Default value for upload bandwidth" +msgstr "上传带宽的默认值" + +msgid "Default value for upload rate" +msgstr "上传速率的默认值" + +msgid "Download Bandwidth (Mbps)" +msgstr "下载带宽 (Mbps)" + +msgid "Download Rate" +msgstr "下载速率" + +msgid "Dynamic Rate Limit" +msgstr "动态QoS" + +msgid "Enable Limit Rate Feature" +msgstr "开启速率限制功能" + +msgid "Enable Traffic Priority" +msgstr "开启流量优先级" + +msgid "Enable this feature" +msgstr "开启这个功能" + +msgid "Hostname" +msgstr "主机名" + +msgid "IP Address" +msgstr "IP地址" + +msgid "Limit Enable" +msgstr "限速开启" + +msgid "Limit Type" +msgstr "限速类型" + +msgid "MAC (optional)" +msgstr "物理地址(可选)" + +msgid "MB" +msgstr "MB" + +msgid "NFT-QoS Settings" +msgstr "NFT-QoS 设置" + +msgid "Network Interface for Traffic Shaping, e.g. br-lan, eth0.1, eth0, etc" +msgstr "流量整形的目标网络接口, 例如, br-lan, eth0.1, eth0, etc" + +msgid "Network to be apply, e.g. 192.168.1.0/24, 10.2.0.0/16, etc" +msgstr "将要应用规则的网络, 例如, 192.168.1.0/24, 10.2.0.0/16, 等等" + +msgid "Network to be apply, e.g. AAAA::BBBB/64, CCCC::1/128, etc" +msgstr "将要应用规则的网络, 例如, AAAA::BBBB/64, CCCC::1/128, 等等" + +msgid "No information available" +msgstr "没有更多的信息" + +msgid "Packets Total" +msgstr "数据包总数" + +msgid "Priority" +msgstr "优先级" + +msgid "Protocol" +msgstr "协议" + +msgid "Qos over Nftables" +msgstr "QoS Nftables版" + +msgid "Rate" +msgstr "速率" + +msgid "Rate Limit" +msgstr "速率限制" + +msgid "Realtime Rate" +msgstr "实时速率显示" + +msgid "Service" +msgstr "服务/端口" + +msgid "Static QoS-Download Rate" +msgstr "静态QoS-下载速率" + +msgid "Static QoS-Upload Rate" +msgstr "静态QoS-上传速率" + +msgid "Target Network (IPv4/MASK)" +msgstr "目标网络(IPv4地址/掩码)" + +msgid "Target Network6 (IPv6/MASK)" +msgstr "目标网络v6(IPv6地址/掩码)" + +msgid "This page gives an overview over currently download/upload rate." +msgstr "该页面提供了当前上传和下载速率的一个总览" + +msgid "Traffic Priority" +msgstr "流量优先级" + +msgid "Traffic Priority Settings" +msgstr "流量优先级设置" + +msgid "Type of Limit Rate" +msgstr "限速的类型" + +msgid "Unit" +msgstr "单位" + +msgid "Upload Bandwidth (Mbps)" +msgstr "上传带宽 (Mbps)" + +msgid "Upload Rate" +msgstr "上传速率" + +msgid "White List for Limit Rate" +msgstr "限速白名单" + +msgid "e.g. https, 23, (separator is comma)" +msgstr "例如, https, 23 (用逗号分隔)" + +msgid "kB" +msgstr "kB" diff --git a/applications/luci-app-nft-qos/po/zh-cn/nft-qos.po b/applications/luci-app-nft-qos/po/zh-cn/nft-qos.po new file mode 100644 index 0000000000..b2e972c316 --- /dev/null +++ b/applications/luci-app-nft-qos/po/zh-cn/nft-qos.po @@ -0,0 +1,172 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.3\n" +"Last-Translator: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Language: zh_CN\n" + +msgid "Bytes Total" +msgstr "字节总数" + +msgid "Collecting data..." +msgstr "正在收集数据" + +msgid "Comment" +msgstr "注释" + +msgid "Default Download Rate" +msgstr "默认下载速率" + +msgid "Default Download Unit" +msgstr "默认下载速率单位" + +msgid "Default Network Interface" +msgstr "默认网络接口" + +msgid "Default Upload Rate" +msgstr "默认上传速率" + +msgid "Default Upload Unit" +msgstr "默认上传速率单位" + +msgid "Default unit for download rate" +msgstr "默认的下载速率单位" + +msgid "Default unit for upload rate" +msgstr "默认的上传速率单位" + +msgid "Default value for download bandwidth" +msgstr "下载带宽的默认值" + +msgid "Default value for download rate" +msgstr "下载速率的默认值" + +msgid "Default value for upload bandwidth" +msgstr "上传带宽的默认值" + +msgid "Default value for upload rate" +msgstr "上传速率的默认值" + +msgid "Download Bandwidth (Mbps)" +msgstr "下载带宽 (Mbps)" + +msgid "Download Rate" +msgstr "下载速率" + +msgid "Dynamic Rate Limit" +msgstr "动态QoS" + +msgid "Enable Limit Rate Feature" +msgstr "开启速率限制功能" + +msgid "Enable Traffic Priority" +msgstr "开启流量优先级" + +msgid "Enable this feature" +msgstr "开启这个功能" + +msgid "Hostname" +msgstr "主机名" + +msgid "IP Address" +msgstr "IP地址" + +msgid "Limit Enable" +msgstr "限速开启" + +msgid "Limit Type" +msgstr "限速类型" + +msgid "MAC (optional)" +msgstr "物理地址(可选)" + +msgid "MB" +msgstr "MB" + +msgid "NFT-QoS Settings" +msgstr "NFT-QoS 设置" + +msgid "Network Interface for Traffic Shaping, e.g. br-lan, eth0.1, eth0, etc" +msgstr "流量整形的目标网络接口, 例如, br-lan, eth0.1, eth0, etc" + +msgid "Network to be apply, e.g. 192.168.1.0/24, 10.2.0.0/16, etc" +msgstr "将要应用规则的网络, 例如, 192.168.1.0/24, 10.2.0.0/16, 等等" + +msgid "Network to be apply, e.g. AAAA::BBBB/64, CCCC::1/128, etc" +msgstr "将要应用规则的网络, 例如, AAAA::BBBB/64, CCCC::1/128, 等等" + +msgid "No information available" +msgstr "没有更多的信息" + +msgid "Packets Total" +msgstr "数据包总数" + +msgid "Priority" +msgstr "优先级" + +msgid "Protocol" +msgstr "协议" + +msgid "Qos over Nftables" +msgstr "QoS Nftables版" + +msgid "Rate" +msgstr "速率" + +msgid "Rate Limit" +msgstr "速率限制" + +msgid "Realtime Rate" +msgstr "实时速率显示" + +msgid "Service" +msgstr "服务/端口" + +msgid "Static QoS-Download Rate" +msgstr "静态QoS-下载速率" + +msgid "Static QoS-Upload Rate" +msgstr "静态QoS-上传速率" + +msgid "Target Network (IPv4/MASK)" +msgstr "目标网络(IPv4地址/掩码)" + +msgid "Target Network6 (IPv6/MASK)" +msgstr "目标网络v6(IPv6地址/掩码)" + +msgid "This page gives an overview over currently download/upload rate." +msgstr "该页面提供了当前上传和下载速率的一个总览" + +msgid "Traffic Priority" +msgstr "流量优先级" + +msgid "Traffic Priority Settings" +msgstr "流量优先级设置" + +msgid "Type of Limit Rate" +msgstr "限速的类型" + +msgid "Unit" +msgstr "单位" + +msgid "Upload Bandwidth (Mbps)" +msgstr "上传带宽 (Mbps)" + +msgid "Upload Rate" +msgstr "上传速率" + +msgid "White List for Limit Rate" +msgstr "限速白名单" + +msgid "e.g. https, 23, (separator is comma)" +msgstr "例如, https, 23 (用逗号分隔)" + +msgid "kB" +msgstr "kB"