diff --git a/package/ctcgfw/luci-app-openclash/Makefile b/package/ctcgfw/luci-app-openclash/Makefile index b1eccdf8f1..2477813c1c 100644 --- a/package/ctcgfw/luci-app-openclash/Makefile +++ b/package/ctcgfw/luci-app-openclash/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-openclash -PKG_VERSION:=0.39.6 +PKG_VERSION:=0.39.7 PKG_RELEASE:=beta PKG_MAINTAINER:=vernesong diff --git a/package/ctcgfw/luci-app-openclash/files/etc/init.d/openclash b/package/ctcgfw/luci-app-openclash/files/etc/init.d/openclash index 4c0164d124..7dca6ae4c5 100755 --- a/package/ctcgfw/luci-app-openclash/files/etc/init.d/openclash +++ b/package/ctcgfw/luci-app-openclash/files/etc/init.d/openclash @@ -1128,7 +1128,7 @@ fi done fi -if [ "$en_mode_tun" -ne 1 ] && [ "$en_mode_tun" -ne 2 ]; then +if [ -z "$en_mode_tun" ] || [ "$en_mode_tun" -eq 3 ]; then #tcp iptables -t nat -N openclash iptables -t nat -F openclash @@ -1139,7 +1139,7 @@ if [ "$en_mode_tun" -ne 1 ] && [ "$en_mode_tun" -ne 2 ]; then iptables -t nat -A openclash -m set --match-set china_ip_route dst -j RETURN >/dev/null 2>&1 fi iptables -t nat -A openclash -p tcp -j REDIRECT --to-ports "$proxy_port" - if [ "$en_mode_tun" -ne 3 ]; then + if [ -z "$en_mode_tun" ]; then iptables -t nat -I PREROUTING -p tcp -d 8.8.8.8 -j REDIRECT --to-ports "$proxy_port" iptables -t nat -I PREROUTING -p tcp -d 8.8.4.4 -j REDIRECT --to-ports "$proxy_port" fi diff --git a/package/ctcgfw/luci-app-openclash/files/etc/openclash/openclash_version b/package/ctcgfw/luci-app-openclash/files/etc/openclash/openclash_version index c521b7278c..50ffafc316 100644 --- a/package/ctcgfw/luci-app-openclash/files/etc/openclash/openclash_version +++ b/package/ctcgfw/luci-app-openclash/files/etc/openclash/openclash_version @@ -1,2 +1,2 @@ -v0.39.6-beta -data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXMAAAAqCAMAAAB2kksrAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjAgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjBBNTEyRjU3RDE1QjExRUE4MzgyQUY3ODk5QTY2NTgyIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjBBNTEyRjU4RDE1QjExRUE4MzgyQUY3ODk5QTY2NTgyIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MEE1MTJGNTVEMTVCMTFFQTgzODJBRjc4OTlBNjY1ODIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MEE1MTJGNTZEMTVCMTFFQTgzODJBRjc4OTlBNjY1ODIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6HWc3zAAADAFBMVEUGcKzR0dFtbW0GVYI9PT3B1eCStckHZp2EvN2EhIS6urokhLtFmsqUxeFTiqmGv98KaqGizOUHXpE6lcqCgoIJeLhlnr6enp52ttra2tqlpaXR4ux4eHgHXI3f398JdbTn5+djlbE/Pz9XpdLGxsahoaHOzs4la5MEXI6Ds85paWnR5vIFbamRkZFxcXG/v79GRkasrKw0dJq1tbVmrNUEU4AJZJkEYJWy1urKysoJca5iYmJkq9OiwNFLS0tDQ0Pg4ODC2eaLi4tFkbwGWopHirF2dnYGdLLAwMCcnJzw9ffCwsJBQUGx0OIXgL0neKZFgKJCQkIFZZomcJuDrcW2trYYYo2jx9xHnMyXl5cnicFlZWWNjY0FaaJJns42kcYrjsdzor2xzdwFcrA0fKUIbKUJWIWjzuavr69gYGCiyd8Zdapyn7iUlJSTvdaTu9FKns8EYpgIYZR0dHSyythDfqAdh8MJcKuJweIwk8t0sdUahMFortdFiK01hbIRgsMCc7QBcrNRUVFUVFRVVVVSUlILfL1WVlYFdrcHeLkKe7wOgMADdLQOf8AEdrYEdbYDdLUDdbUSg8MSg8RXV1cShMQAcrIThMUGd7gOf78Nfr8Nfr4Mfb4Mfb0IebkJeroJe7sJers6OjqqqqrU1NTV1dWrq6tISEipqak7OzuAgIB+fn7w9/sHVoTC3u5JSUmBgYHq6urh7/f19fVMTEzz8/P09PR/f3+DvNyFvt7A1N/B3e3v9PeCqcDg6u+hv9CErMLB3e6JiYnB3u7o6Oh0s9gIaJ/g6vALerkUXonW1taDq8LD3++EtNDC3+8LdK/g7/cFa6aDqsEEWIgFZ5+Evd3R3+hGm8tVos/g7vZInc2CutsZg8BGg6YGdbSDr8jv9voLb6gKeLeRuM8VaJdInc4IWYcEVYNXk7Y1jsKErcWjxdgvksvP5PFkmbdTU1MPgMEQgcJZWVlaWlpfX19bW1tcXFxNTU1eXl5PT09QUFBYWFhdXV1OTk7////////xDrwLAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAADGJJREFUeNrsVwlUFOcdH2EBV8UDjCtkVVgUUEAHcVFBFyQarKIxGK3H08QY0SRqvKJJNGkrAkJ6l7YmTQxyGxaQM4p44G2M95HL3Im2TZttrQ2I4Uf/3zezuzMLGF6T53u7z997zPc/f/+Z3zc7MwitrVXLht10BfzZCfD8c+bWVqE1fu1N18AfnQLPh7UKVcObXAR/cA48bxaWuYrkTb93EjwnDP/OVfAzJ8E/hO/uaX634UKa/9tZIHzrMrin+d3Hv5wFwn9dBvc0v/t42Vkg/Mdl8CtnQbuaayMjIyPcfnxV5mu1822Om1bbmR69Vt9J9lc6wsu+/Xv1920TXh/Uq1evVTb3sU1KTwGW6L9eHeuFXq/83xBuOCJ2VhU44ufG3viB0EZqVX4V5trsyRjbGYq38XYnh73aAda/wy/nnfWq6GNSFJVBku8teascu32lOoc4ad7RuFdX9Vr16h3RRnN9BeBXqNMF0yDtD9U8EpFKN2ME4m1bC0T8uJr/pQOcwf39JvW7H2dU0YXAlYMHx08BFjJ3KcyLJv11guzZsQmYMv7gwSsO4T3Y09G4O+Y4hNtqxMajxk3DYNLV9L39A0Gaq/zhgJtszkVNWmcoRI3YyWGvtY9NOD47JSVl9hRsUoYXjg9JYeHjWMqLpsy+di0lZTwqVc20MwdZWcpZNSnp+lpHuFOOQ2ijUk2sJq7cZBI1moxhndVW31e1PX37urWveVEAhshmAWa1yMX69hljHTR3Uw+JtVZY8Xr7GINFPp+d/cznIMYow2dTUnx6946+dhBnyDsDz2tLzm5YQzsTpKyqJMmvRffu7XNWTUq6vv76Ywt9FaGFVo/nbEFVjQRHzaugM2zmVoaJGQXYxb1dKJCPc+OBwtuFKIwtpMcQyxayF0BVIa8DYrlbEMsdCTb2zTpUyALSHZ9Nwk1m+YqE2yry20MqeJhRFkIiTuChybFypRtvnKU89XQZQaiUrUoEpaeb8eLnZJ/4COZ0Bc5Gs2j6iWfwFC3A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 \ No newline at end of file +v0.39.7-beta +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXMAAAAqCAYAAABBTLsZAAAACXBIWXMAAC4jAAAuIwF4pT92AAAGWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTA4LTExVDIxOjI5OjQ0KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMC0wOC0xMVQyMTozMToxNiswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMC0wOC0xMVQyMTozMToxNiswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDphMGQ4NDQ5MC0zODlkLTRiNDMtODQwNC1iNDZmZjA2YTMyOGYiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDoxYWIyMDk2My0zNWU4LThkNDgtYWFkMi1iMzVhMDQwNWUzNDQiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjMWE2NDdiZi1hMWU5LWU5NDctYjI0Yi05MGZjYzI4MzliYmEiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmMxYTY0N2JmLWExZTktZTk0Ny1iMjRiLTkwZmNjMjgzOWJiYSIgc3RFdnQ6d2hlbj0iMjAyMC0wOC0xMVQyMToyOTo0NCswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIxLjAgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmciLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmEwZDg0NDkwLTM4OWQtNGI0My04NDA0LWI0NmZmMDZhMzI4ZiIgc3RFdnQ6d2hlbj0iMjAyMC0wOC0xMVQyMTozMToxNiswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIxLjAgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsRjhuEAABWqSURBVHja7V1pcFVHdn7JgCQgmWFmksFOJb8SsCuZH66a2Em82yA2G7xgmcVYgCQwmF1IAkwCDySE2UELGAwIIWEMErsEGJCEhACzGCE2M2bMk50YCJMYV2zHP/Kj018/nfv63dd3lYSf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 \ No newline at end of file diff --git a/package/lienol/luci-app-passwall/Makefile b/package/lienol/luci-app-passwall/Makefile index 0ab4cb07d9..5b4c6632ad 100644 --- a/package/lienol/luci-app-passwall/Makefile +++ b/package/lienol/luci-app-passwall/Makefile @@ -7,8 +7,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall PKG_VERSION:=3.9 -PKG_RELEASE:=33 -PKG_DATE:=20200810 +PKG_RELEASE:=35 +PKG_DATE:=20200812 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_trojan.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_trojan.lua index e5c0f8cf36..c8fd459899 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_trojan.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_trojan.lua @@ -25,7 +25,7 @@ local trojan = { sni = node.tls_serverName, alpn = {"h2", "http/1.1"}, reuse_session = true, - session_ticket = (node.tls_sessionTicket == "1") and true or false, + session_ticket = (node.tls_sessionTicket and node.tls_sessionTicket == "1") and true or false, curves = "" }, udp_timeout = 60, diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_v2ray.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_v2ray.lua index ae478c2d71..e5e9278cda 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_v2ray.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_v2ray.lua @@ -41,15 +41,20 @@ local function gen_outbound(node, tag) end node.stream_security = "none" end + + if node.transport == "mkcp" or node.transport == "ds" or node.transport == "quic" then + node.stream_security = "none" + end + result = { tag = tag, - protocol = node.protocol or "vmess", + protocol = node.protocol, mux = { enabled = (node.mux == "1") and true or false, concurrency = (node.mux_concurrency) and tonumber(node.mux_concurrency) or 8 }, -- 底层传输配置 - streamSettings = (node.protocol == "vmess" or node.protocol == "socks" or node.protocol == "shadowsocks") and { + streamSettings = (node.protocol == "vmess" or node.protocol == "vless" or node.protocol == "socks" or node.protocol == "shadowsocks") and { network = node.transport, security = node.stream_security, tlsSettings = (node.stream_security == "tls") and { @@ -96,16 +101,17 @@ local function gen_outbound(node, tag) } or nil } or nil, settings = { - vnext = (node.protocol == "vmess") and { + vnext = (node.protocol == "vmess" or node.protocol == "vless") and { { address = node.address, port = tonumber(node.port), users = { { - id = node.vmess_id, + id = node.uuid, alterId = tonumber(node.alter_id), - level = tonumber(node.vmess_level), - security = node.security + level = node.level and tonumber(node.level) or 0, + security = node.security, + encryption = node.encryption or "none" } } } @@ -125,11 +131,6 @@ local function gen_outbound(node, tag) } end - if node.transport == "mkcp" or node.transport == "ds" or node.transport == "quic" then - result.streamSettings.security = "none" - result.streamSettings.tlsSettings = nil - end - return result end diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_config.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_config.lua index 4d130093c2..8d40222c8b 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_config.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_config.lua @@ -97,6 +97,7 @@ end protocol = s:option(ListValue, "protocol", translate("Protocol")) protocol:value("vmess", translate("Vmess")) +protocol:value("vless", translate("VLESS")) protocol:value("http", translate("HTTP")) protocol:value("socks", translate("Socks")) protocol:value("shadowsocks", translate("Shadowsocks")) @@ -159,6 +160,7 @@ address:depends("type", "Socks") address:depends("type", "SS") address:depends("type", "SSR") address:depends({ type = "V2ray", protocol = "vmess" }) +address:depends({ type = "V2ray", protocol = "vless" }) address:depends({ type = "V2ray", protocol = "http" }) address:depends({ type = "V2ray", protocol = "socks" }) address:depends({ type = "V2ray", protocol = "shadowsocks" }) @@ -174,6 +176,7 @@ use_ipv6:depends("type", "Socks") use_ipv6:depends("type", "SS") use_ipv6:depends("type", "SSR") use_ipv6:depends({ type = "V2ray", protocol = "vmess" }) +use_ipv6:depends({ type = "V2ray", protocol = "vless" }) use_ipv6:depends({ type = "V2ray", protocol = "http" }) use_ipv6:depends({ type = "V2ray", protocol = "socks" }) use_ipv6:depends({ type = "V2ray", protocol = "shadowsocks" }) @@ -190,6 +193,7 @@ port:depends("type", "Socks") port:depends("type", "SS") port:depends("type", "SSR") port:depends({ type = "V2ray", protocol = "vmess" }) +port:depends({ type = "V2ray", protocol = "vless" }) port:depends({ type = "V2ray", protocol = "http" }) port:depends({ type = "V2ray", protocol = "socks" }) port:depends({ type = "V2ray", protocol = "shadowsocks" }) @@ -240,6 +244,10 @@ security = s:option(ListValue, "security", translate("Encrypt Method")) for a, t in ipairs(security_list) do security:value(t) end security:depends("protocol", "vmess") +encryption = s:option(Value, "encryption", translate("Encrypt Method")) +encryption.default = "none" +encryption:depends("protocol", "vless") + v_ss_encrypt_method = s:option(ListValue, "v_ss_encrypt_method", translate("Encrypt Method")) for a, t in ipairs(v_ss_encrypt_method_list) do v_ss_encrypt_method:value(t) end v_ss_encrypt_method:depends("protocol", "shadowsocks") @@ -336,22 +344,25 @@ kcp_opts = s:option(TextValue, "kcp_opts", translate("Kcptun Config"), translate kcp_opts.placeholder = "--crypt aes192 --key abc123 --mtu 1350 --sndwnd 128 --rcvwnd 1024 --mode fast" kcp_opts:depends("use_kcp", "1") -vmess_id = s:option(Value, "vmess_id", translate("ID")) -vmess_id.password = true -vmess_id:depends("protocol", "vmess") +uuid = s:option(Value, "uuid", translate("ID")) +uuid.password = true +uuid:depends("protocol", "vmess") +uuid:depends("protocol", "vless") alter_id = s:option(Value, "alter_id", translate("Alter ID")) alter_id:depends("protocol", "vmess") -vmess_level = s:option(Value, "vmess_level", translate("User Level")) -vmess_level.default = 1 -vmess_level:depends("protocol", "vmess") +level = s:option(Value, "level", translate("User Level")) +level.default = 1 +level:depends("protocol", "vmess") +level:depends("protocol", "vless") -stream_security = s:option(ListValue, "stream_security", translate("Transport Layer Encryption"), translate('Whether or not transport layer encryption is enabled, the supported options are "none" for unencrypted (default) and "TLS" for using TLS.')) +stream_security = s:option(ListValue, "stream_security", translate("Transport Layer Encryption"), translate('Whether or not transport layer encryption is enabled, the supported options are "none" for unencrypted and "TLS" for using TLS.')) stream_security:value("none", "none") stream_security:value("tls", "tls") stream_security.default = "tls" stream_security:depends("protocol", "vmess") +stream_security:depends("protocol", "vless") stream_security:depends("protocol", "socks") stream_security:depends("protocol", "shadowsocks") stream_security:depends("type", "Trojan") @@ -359,7 +370,7 @@ stream_security:depends("type", "Trojan-Plus") stream_security:depends("type", "Trojan-Go") stream_security.validate = function(self, value) if value == "none" and (type:formvalue(arg[1]) == "Trojan" or type:formvalue(arg[1]) == "Trojan-Plus") then - return nil, translate("'none' not supported for original Trojan.") + return nil, translate("'none' not supported for original Trojan, please choose 'tls'.") end return value end @@ -378,7 +389,7 @@ trojan_force_fp:depends({ type = "Trojan-Go", stream_security = "tls" }) tls_serverName = s:option(Value, "tls_serverName", translate("Domain")) tls_serverName:depends("stream_security", "tls") -tls_allowInsecure = s:option(Flag, "tls_allowInsecure", translate("allowInsecure"), translate("Whether unsafe connections are allowed. When checked, V2Ray does not check the validity of the TLS certificate provided by the remote host.")) +tls_allowInsecure = s:option(Flag, "tls_allowInsecure", translate("allowInsecure"), translate("Whether unsafe connections are allowed. When checked, Certificate validation will be skipped.")) tls_allowInsecure.default = "0" tls_allowInsecure:depends("stream_security", "tls") @@ -425,6 +436,7 @@ transport:value("h2", "HTTP/2") transport:value("ds", "DomainSocket") transport:value("quic", "QUIC") transport:depends("protocol", "vmess") +transport:depends("protocol", "vless") transport:depends("protocol", "socks") transport:depends("protocol", "shadowsocks") @@ -549,6 +561,7 @@ ss_aead_pwd:depends("ss_aead", "1") -- [[ Mux ]]-- mux = s:option(Flag, "mux", translate("Mux")) mux:depends({ type = "V2ray", protocol = "vmess" }) +mux:depends({ type = "V2ray", protocol = "vless" }) mux:depends({ type = "V2ray", protocol = "http" }) mux:depends({ type = "V2ray", protocol = "socks" }) mux:depends({ type = "V2ray", protocol = "shadowsocks" }) diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_subscribe.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_subscribe.lua index 37879ba92a..3cd6757bf9 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_subscribe.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_subscribe.lua @@ -57,7 +57,7 @@ o = s:option(Flag, "filter_keyword_discarded", translate("Filter keyword discard o.default = "1" o.rmempty = false -o = s:option(Flag, "allowInsecure", translate("allowInsecure"), translate("Whether unsafe connections are allowed. When checked, V2Ray does not check the validity of the TLS certificate provided by the remote host by default.")) +o = s:option(Flag, "allowInsecure", translate("allowInsecure"), translate("Whether unsafe connections are allowed. When checked, Certificate validation will be skipped.")) o.default = "1" o.rmempty = false diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/app.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/app.lua index 20c6e0b18b..68dcb76a17 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/app.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/app.lua @@ -89,7 +89,7 @@ local function start() config = require("luci.model.cbi.passwall.server.api.trojan").gen_config(user) bin = ln_start(_api.get_trojan_go_path(), "trojan-go", "-config " .. config_file) elseif type == "Brook" then - local brook_protocol = user.brook_protocol + local brook_protocol = user.protocol local brook_password = user.password bin = ln_start(_api.get_brook_path(), "brook_" .. id, string.format("%s -l :%s -p %s", brook_protocol, port, brook_password)) end diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/ssr.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/ssr.lua index a00dd0fb23..24f9931af1 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/ssr.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/ssr.lua @@ -6,8 +6,8 @@ function gen_config(user) config.password = user.password config.timeout = tonumber(user.timeout) config.fast_open = (user.tcp_fast_open and user.tcp_fast_open == "true") and true or false - config.method = user.ssr_encrypt_method - config.protocol = user.ssr_protocol + config.method = user.method + config.protocol = user.protocol config.protocol_param = user.protocol_param config.obfs = user.obfs config.obfs_param = user.obfs_param diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/trojan.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/trojan.lua index 1f8df594af..2b5a6e145b 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/trojan.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/trojan.lua @@ -8,7 +8,7 @@ function gen_config(user) local_port = tonumber(user.port), remote_addr = (user.remote_enable == "1" and user.remote_address) and user.remote_address or nil, remote_port = (user.remote_enable == "1" and user.remote_port) and tonumber(user.remote_port) or nil, - password = user.type == "Trojan-Go" and user.passwords or { user.password }, + password = user.type == "Trojan-Go" and user.uuid or { user.password }, log_level = 1, ssl = (user.stream_security == nil or user.stream_security == "tls") and { cert = user.tls_certificateFile, diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/v2ray.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/v2ray.lua index 73bad155a7..fa149de89d 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/v2ray.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/v2ray.lua @@ -8,17 +8,20 @@ function gen_config(user) {protocol = "freedom", tag = "direct"}, {protocol = "blackhole", tag = "blocked"} } - if user.protocol == "vmess" then - if user.vmess_id then + if user.protocol == "vmess" or user.protocol == "vless" then + if user.uuid then local clients = {} - for i = 1, #user.vmess_id do + for i = 1, #user.uuid do clients[i] = { - id = user.vmess_id[i], + id = user.uuid[i], level = tonumber(user.level), alterId = tonumber(user.alter_id) } end - settings = {clients = clients} + settings = { + clients = clients, + decryption = user.decryption or "none" + } end elseif user.protocol == "socks" then settings = { @@ -73,9 +76,12 @@ function gen_config(user) if user.transit_node and user.transit_node ~= "nil" then local node = ucic:get_all("passwall", user.transit_node) if node and node ~= "nil" and node.type and node.type == "V2ray" then + if node.transport == "mkcp" or node.transport == "ds" or node.transport == "quic" then + node.stream_security = "none" + end local transit_node = { tag = "transit", - protocol = node.protocol or "vmess", + protocol = node.protocol, mux = { enabled = (node.mux == "1") and true or false, concurrency = (node.mux_concurrency) and tonumber(node.mux_concurrency) or 8 @@ -128,16 +134,17 @@ function gen_config(user) } or nil }, settings = { - vnext = (node.protocol == "vmess") and { + vnext = (node.protocol == "vmess" or node.protocol == "vless") and { { address = node.address, port = tonumber(node.port), users = { { - id = node.vmess_id, + id = node.uuid, alterId = tonumber(node.alter_id), - level = tonumber(node.level), - security = node.security + level = node.level and tonumber(node.level) or 0, + security = node.security, + encryption = node.encryption or "none" } } } @@ -160,12 +167,6 @@ function gen_config(user) } or nil } } - - if node.transport == "mkcp" or node.transport == "ds" or node.transport == "quic" then - transit_node.streamSettings.security = "none" - transit_node.streamSettings.tlsSettings = nil - end - table.insert(outbounds, 1, transit_node) end end diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/user.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/user.lua index f40e748828..f6f0e1972e 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/user.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/user.lua @@ -39,10 +39,10 @@ local encrypt_methods_ss_aead = { "aes-256-gcm", } -map = Map("passwall_server", translate("Server Config")) -map.redirect = d.build_url("admin", "services", "passwall", "server") +m = Map("passwall_server", translate("Server Config")) +m.redirect = d.build_url("admin", "services", "passwall", "server") -s = map:section(NamedSection, arg[1], "user", "") +s = m:section(NamedSection, arg[1], "user", "") s.addremove = false s.dynamic = false @@ -81,6 +81,7 @@ end protocol = s:option(ListValue, "protocol", translate("Protocol")) protocol:value("vmess", "Vmess") +protocol:value("vless", "VLESS") protocol:value("http", "HTTP") protocol:value("socks", "Socks") protocol:value("shadowsocks", "Shadowsocks") @@ -92,6 +93,12 @@ brook_protocol = s:option(ListValue, "brook_protocol", translate("Brook Protocol brook_protocol:value("server", "Brook") brook_protocol:value("wsserver", "WebSocket") brook_protocol:depends("type", "Brook") +function brook_protocol.cfgvalue(self, section) + return m:get(section, "protocol") +end +function brook_protocol.write(self, section, value) + m:set(section, "protocol", value) +end brook_tls = s:option(Flag, "brook_tls", translate("Use TLS")) brook_tls:depends("brook_protocol", "wsserver") @@ -115,20 +122,29 @@ password:depends({ type = "V2ray", protocol = "socks" }) password:depends({ type = "V2ray", protocol = "shadowsocks" }) password:depends({ type = "V2ray", protocol = "mtproto" }) -passwords = s:option(DynamicList, "passwords", translate("Password")) -for i = 1, 3 do - local uuid = luci.sys.exec("echo -n $(cat /proc/sys/kernel/random/uuid)") - passwords:value(uuid) -end -passwords:depends("type", "Trojan-Go") +decryption = s:option(Value, "decryption", translate("Encrypt Method")) +decryption.default = "none" +decryption:depends("protocol", "vless") ssr_encrypt_method = s:option(ListValue, "ssr_encrypt_method", translate("Encrypt Method")) for a, t in ipairs(ssr_encrypt_method_list) do ssr_encrypt_method:value(t) end ssr_encrypt_method:depends("type", "SSR") +function ssr_encrypt_method.cfgvalue(self, section) + return m:get(section, "method") +end +function ssr_encrypt_method.write(self, section, value) + m:set(section, "method", value) +end v_ss_encrypt_method = s:option(ListValue, "v_ss_encrypt_method", translate("Encrypt Method")) for a, t in ipairs(v_ss_encrypt_method_list) do v_ss_encrypt_method:value(t) end v_ss_encrypt_method:depends("protocol", "shadowsocks") +function v_ss_encrypt_method.cfgvalue(self, section) + return m:get(section, "method") +end +function v_ss_encrypt_method.write(self, section, value) + m:set(section, "method", value) +end ss_network = s:option(ListValue, "ss_network", translate("Transport")) ss_network.default = "tcp,udp" @@ -137,16 +153,28 @@ ss_network:value("udp", "UDP") ss_network:value("tcp,udp", "TCP,UDP") ss_network:depends("protocol", "shadowsocks") -ss_ota = s:option(Flag, "ss_ota", translate("OTA"), translate("When OTA is enabled, V2Ray will reject connections that are not OTA enabled. This option is invalid when using AEAD encryption.")) +ss_ota = s:option(Flag, "ss_ota", translate("OTA"), translate("When OTA is enabled, a connection that is not OTA enabled is rejected. This option is invalid when using AEAD encryption.")) ss_ota.default = "0" ss_ota:depends("protocol", "shadowsocks") +function ss_ota.cfgvalue(self, section) + return m:get(section, "ota") +end +function ss_ota.write(self, section, value) + m:set(section, "ota", value) +end ssr_protocol = s:option(ListValue, "ssr_protocol", translate("Protocol")) for a, t in ipairs(ssr_protocol_list) do ssr_protocol:value(t) end ssr_protocol:depends("type", "SSR") +function ssr_protocol.cfgvalue(self, section) + return m:get(section, "protocol") +end +function ssr_protocol.write(self, section, value) + m:set(section, "protocol", value) +end -ssr_protocol_param = s:option(Value, "protocol_param", translate("Protocol_param")) -ssr_protocol_param:depends("type", "SSR") +protocol_param = s:option(Value, "protocol_param", translate("Protocol_param")) +protocol_param:depends("type", "SSR") obfs = s:option(ListValue, "obfs", translate("Obfs")) for a, t in ipairs(ssr_obfs_list) do obfs:value(t) end @@ -173,12 +201,13 @@ udp_forward.default = "1" udp_forward.rmempty = false udp_forward:depends("type", "SSR") -vmess_id = s:option(DynamicList, "vmess_id", translate("ID")) +uuid = s:option(DynamicList, "uuid", translate("ID")) for i = 1, 3 do - local uuid = luci.sys.exec("echo -n $(cat /proc/sys/kernel/random/uuid)") - vmess_id:value(uuid) + uuid:value(api.gen_uuid()) end -vmess_id:depends({ type = "V2ray", protocol = "vmess" }) +uuid:depends({ type = "V2ray", protocol = "vmess" }) +uuid:depends({ type = "V2ray", protocol = "vless" }) +uuid:depends("type", "Trojan-Go") alter_id = s:option(Value, "alter_id", translate("Alter ID")) alter_id.default = 16 @@ -187,15 +216,16 @@ alter_id:depends({ type = "V2ray", protocol = "vmess" }) level = s:option(Value, "level", translate("User Level")) level.default = 1 level:depends({ type = "V2ray", protocol = "vmess" }) +level:depends({ type = "V2ray", protocol = "vless" }) level:depends({ type = "V2ray", protocol = "shadowsocks" }) level:depends({ type = "V2ray", protocol = "mtproto" }) -stream_security = s:option(ListValue, "stream_security", translate("Transport Layer Encryption"), translate('Whether or not transport layer encryption is enabled, the supported options are "none" for unencrypted (default) and "TLS" for using TLS.')) +stream_security = s:option(ListValue, "stream_security", translate("Transport Layer Encryption"), translate('Whether or not transport layer encryption is enabled, the supported options are "none" for unencrypted and "TLS" for using TLS.')) stream_security:value("none", "none") stream_security:value("tls", "tls") -stream_security.default = "tls" -stream_security:depends({ type = "V2ray", protocol = "vmess", transport = "ws" }) -stream_security:depends({ type = "V2ray", protocol = "vmess", transport = "h2" }) +stream_security.default = "none" +stream_security:depends({ type = "V2ray", protocol = "vmess" }) +stream_security:depends({ type = "V2ray", protocol = "vless" }) stream_security:depends({ type = "V2ray", protocol = "socks" }) stream_security:depends({ type = "V2ray", protocol = "shadowsocks" }) stream_security:depends("type", "Trojan") @@ -203,7 +233,7 @@ stream_security:depends("type", "Trojan-Plus") stream_security:depends("type", "Trojan-Go") stream_security.validate = function(self, value) if value == "none" and (type:formvalue(arg[1]) == "Trojan" or type:formvalue(arg[1]) == "Trojan-Plus") then - return nil, translate("'none' not supported for original Trojan.") + return nil, translate("'none' not supported for original Trojan, please choose 'tls'.") end return value end @@ -234,6 +264,7 @@ transport:value("h2", "HTTP/2") transport:value("ds", "DomainSocket") transport:value("quic", "QUIC") transport:depends({ type = "V2ray", protocol = "vmess" }) +transport:depends({ type = "V2ray", protocol = "vless" }) transport:depends({ type = "V2ray", protocol = "socks" }) transport:depends({ type = "V2ray", protocol = "shadowsocks" }) @@ -366,6 +397,26 @@ quic_guise = s:option(ListValue, "quic_guise", translate("Camouflage Type")) for a, t in ipairs(header_type_list) do quic_guise:value(t) end quic_guise:depends("transport", "quic") +-- [[ VLESS Fallback部分 ]]-- +--[[ +fallback = s:option(Flag, "fallback", translate("Fallback")) +fallback:depends({ type = "V2ray", protocol = "vless", transport = "tcp", stream_security = "tls" }) + +fallback_addr = s:option(Value, "fallback_addr", "Fallback" .. translate("Address (Support Domain Name)")) +fallback_addr:depends("fallback", "1") + +fallback_port = s:option(Value, "fallback_port", "Fallback" .. translate("Port")) +fallback_port.datatype = "port" +fallback_port:depends("fallback", "1") + +fallback_unix = s:option(Value, "fallback_unix", "Fallback UNIX domain socket", translate("UNIX domain socket, absolute path, you can add @ at the beginning to represent abstract, and it is empty by default. If this value is filled in, addr and port will be ignored.")) +fallback_unix:depends("fallback", "1") + +fallback_xver = s:option(Value, "fallback_xver", "Fallback xver") +fallback_xver.default = 0 +fallback_xver:depends("fallback", "1") +]]-- + remote_enable = s:option(Flag, "remote_enable", translate("Enable Remote"), translate("You can forward to Nginx/Caddy/V2ray WebSocket and more.")) remote_enable.default = "1" remote_enable.rmempty = false @@ -422,4 +473,4 @@ accept_lan.default = "0" accept_lan.rmempty = false accept_lan:depends("type", "V2ray") -return map +return m diff --git a/package/lienol/luci-app-passwall/luasrc/view/passwall/log/log.htm b/package/lienol/luci-app-passwall/luasrc/view/passwall/log/log.htm index 8741be33a7..8d1467aa33 100644 --- a/package/lienol/luci-app-passwall/luasrc/view/passwall/log/log.htm +++ b/package/lienol/luci-app-passwall/luasrc/view/passwall/log/log.htm @@ -11,7 +11,7 @@ } ); } - XHR.poll(2, '<%=url([[admin]], [[services]], [[passwall]], [[get_log]])%>', null, + XHR.poll(30, '<%=url([[admin]], [[services]], [[passwall]], [[get_log]])%>', null, function(x, data) { if(x && x.status == 200) { var log_textarea = document.getElementById('log_textarea'); diff --git a/package/lienol/luci-app-passwall/po/zh-cn/passwall.po b/package/lienol/luci-app-passwall/po/zh-cn/passwall.po index 734bcecca2..240a65c0b5 100644 --- a/package/lienol/luci-app-passwall/po/zh-cn/passwall.po +++ b/package/lienol/luci-app-passwall/po/zh-cn/passwall.po @@ -490,6 +490,9 @@ msgstr "TCP转发端口" msgid "UDP Redir Ports" msgstr "UDP转发端口" +msgid "No patterns are used" +msgstr "不使用" + msgid "All" msgstr "所有" @@ -589,6 +592,9 @@ msgstr "负载比重" msgid "Export Of Multi WAN" msgstr "多WAN指定出口" +msgid "Main" +msgstr "主要" + msgid "Mode" msgstr "模式" @@ -727,9 +733,6 @@ msgstr "关键字丢弃" msgid "When checked, the keywords in the list are discarded. Otherwise, it is not discarded." msgstr "当勾选时,将丢弃包含列表里的关键字的节点。否则,将保留列表的关键字的节点(反过来)。" -msgid "Whether unsafe connections are allowed. When checked, V2Ray does not check the validity of the TLS certificate provided by the remote host by default." -msgstr "是否允许不安全连接。当勾选时,缺省情况下客户端不会检查远端主机所提供的 TLS 证书的有效性。" - msgid "Add" msgstr "添加" @@ -856,14 +859,17 @@ msgstr "伪装类型" msgid "Transport Layer Encryption" msgstr "传输层加密" -msgid "Whether or not transport layer encryption is enabled, the supported options are \"none\" for unencrypted (default) and \"TLS\" for using TLS." -msgstr "是否启入传输层加密,支持的选项有 \"none\" 表示不加密(默认值),\"tls\" 表示使用 TLS。" +msgid "Whether or not transport layer encryption is enabled, the supported options are \"none\" for unencrypted and \"TLS\" for using TLS." +msgstr "是否启入传输层加密,支持的选项有 \"none\" 表示不加密,\"tls\" 表示使用 TLS。" + +msgid "'none' not supported for original Trojan, please choose 'tls'." +msgstr "原版Trojan不支持'none',请选择TLS。" msgid "Domain" msgstr "域名" -msgid "Whether unsafe connections are allowed. When checked, V2Ray does not check the validity of the TLS certificate provided by the remote host." -msgstr "是否允许不安全连接。当勾选时,V2Ray 不会检查远端主机所提供的 TLS 证书的有效性。" +msgid "Whether unsafe connections are allowed. When checked, Certificate validation will be skipped." +msgstr "是否允许不安全连接。当勾选时,将跳过证书验证。" msgid "
none: default, no masquerade, data sent is packets with no characteristics.
srtp: disguised as an SRTP packet, it will be recognized as video call data (such as FaceTime).
utp: packets disguised as uTP will be recognized as bittorrent downloaded data.
wechat-video: packets disguised as WeChat video calls.
dtls: disguised as DTLS 1.2 packet.
wireguard: disguised as a WireGuard packet. (not really WireGuard protocol)" msgstr "
none:默认值,不进行伪装,发送的数据是没有特征的数据包。
srtp:伪装成 SRTP 数据包,会被识别为视频通话数据(如 FaceTime)。
utp:伪装成 uTP 数据包,会被识别为 BT 下载数据。
wechat-video:伪装成微信视频通话的数据包。
dtls:伪装成 DTLS 1.2 数据包。
wireguard:伪装成 WireGuard 数据包。(并不是真正的 WireGuard 协议)" @@ -871,6 +877,9 @@ msgstr "
none:默认值,不进行伪装,发送的数据是没有特 msgid "A legal file path. This file must not exist before running V2Ray." msgstr "一个合法的文件路径。在运行 V2Ray 之前,这个文件必须不存在。" +msgid "UNIX domain socket, absolute path, you can add @ at the beginning to represent abstract, and it is empty by default. If this value is filled in, addr and port will be ignored." +msgstr "UNIX domain socket,绝对路径,可在开头加 @ 代表 abstract,默认为空。若填写了该值,addr 和 port 将被忽略。" + msgid "TCP Open Socks" msgstr "开启Socks" @@ -913,8 +922,8 @@ msgstr "隐藏菜单方法,地址栏输入例:" msgid "After the hidden to the display, input example in the address bar:" msgstr "当你隐藏后想再次显示,地址栏输入例:" -msgid "When OTA is enabled, V2Ray will reject connections that are not OTA enabled. This option is invalid when using AEAD encryption." -msgstr "开启 OTA 后,V2Ray 会拒绝未启用 OTA 的连接。当使用 AEAD 加密时,该选项无效。" +msgid "When OTA is enabled, a connection that is not OTA enabled is rejected. This option is invalid when using AEAD encryption." +msgstr "开启 OTA 后,将拒绝未启用 OTA 的连接。当使用 AEAD 加密时,该选项无效。" msgid "transit node" msgstr "中转到此节点" diff --git a/package/lienol/luci-app-passwall/root/usr/share/passwall/app.sh b/package/lienol/luci-app-passwall/root/usr/share/passwall/app.sh index 475a7f12c8..5d040b0b7f 100755 --- a/package/lienol/luci-app-passwall/root/usr/share/passwall/app.sh +++ b/package/lienol/luci-app-passwall/root/usr/share/passwall/app.sh @@ -618,7 +618,7 @@ stop_crontab() { start_dns() { local dns2socks_socks_server dns2socks_forward dns2sock_cache pdnsd_port pdnsd_forward other_port up_trust_pdnsd_dns msg - local chnlist returnhome china_ng_chn china_ng_gfw chnlist_param gfwlist_param extra_mode up_trust_chinadns_ng_dns + local global chnlist returnhome china_ng_chn china_ng_gfw chnlist_param gfwlist_param extra_mode up_trust_chinadns_ng_dns dns2socks_socks_server=$(echo $(config_t_get global socks_server 127.0.0.1:9050) | sed "s/#/:/g") dns2socks_forward=$(get_first_dns DNS_FORWARD 53 | sed 's/#/:/g') dns2socks_listen="127.0.0.1:${DNS_PORT}" @@ -629,6 +629,9 @@ start_dns() { other_port=$(expr $DNS_PORT + 1) china_ng_gfw="127.0.0.1#${other_port}" returnhome=$(echo "${TCP_PROXY_MODE}${LOCALHOST_TCP_PROXY_MODE}${UDP_PROXY_MODE}${LOCALHOST_UDP_PROXY_MODE}" | grep "returnhome") + global=$(echo "${TCP_PROXY_MODE}${LOCALHOST_TCP_PROXY_MODE}${UDP_PROXY_MODE}${LOCALHOST_UDP_PROXY_MODE}" | grep "global") + chnlist=$(echo "${TCP_PROXY_MODE}${LOCALHOST_TCP_PROXY_MODE}${UDP_PROXY_MODE}${LOCALHOST_UDP_PROXY_MODE}" | grep "chnroute") + [ -n "${returnhome}" ] && china_ng_chn="${china_ng_gfw}" && china_ng_gfw="${LOCAL_DNS}" sed -n 's/^ipset=\/\.\?\([^/]*\).*$/\1/p' "${RULES_PATH}/gfwlist.conf" | sort -u > "${TMP_PATH}/gfwlist.txt" echolog "过滤服务配置:准备接管域名解析[$?]..." case "$DNS_MODE" in @@ -642,7 +645,7 @@ start_dns() { pdnsd) up_trust_pdnsd_dns=$(config_t_get global up_trust_pdnsd_dns "nil") if [ "$up_trust_pdnsd_dns" = "dns2socks" ]; then - pdnsd_forward=${china_ng_gfw} + [ -n "${returnhome}" ] && pdnsd_forward=${china_ng_chn} || pdnsd_forward=${china_ng_gfw} dns2socks_listen=${pdnsd_forward} msg="dns2socks" elif [ "$up_trust_pdnsd_dns" = "udp" ]; then @@ -655,39 +658,44 @@ start_dns() { ;; chinadns-ng) up_trust_chinadns_ng_dns=$(config_t_get global up_trust_chinadns_ng_dns "pdnsd") + echolog " | - (chinadns-ng) 只支持2~4级的域名过滤..." + [ -z "${global}${chnlist}" ] && echolog " | - (chinadns-ng) 此模式下,列表外的域名查询会同时发送给本地DNS(可切换到Pdnsd + TCP节点模式解决)..." + [ -n "${returnhome}" ] && msg="本地" || msg="代理" + [ -z "${global}${chnlist}" ] && echolog " | - (chinadns-ng) 列表外域名查询的结果,不在中国IP段内(chnroute/chnroute6)时,只采信${msg} DNS 的应答..." + echolog " | - (chinadns-ng) 上游 DNS (${china_ng_gfw}) 有一定概率会比 DNS (${china_ng_chn}) 先返回的话(比如 DNS 的本地查询缓存),启用 '公平模式' 可以优先接受${msg} DNS 的中国IP段内(chnroute/chnroute6)的应答..." if [ "$up_trust_chinadns_ng_dns" = "pdnsd" ]; then pdnsd_port=${other_port} msg="pdnsd" - echolog " | - (chinadns-ng) 只支持2~4级的域名过滤,列表外的域名查询会同时发送给本地DNS(可切换到Pdnsd + TCP节点模式解决)..." - echolog " | - (chinadns-ng) 虽然列表外域名查询的结果,不在中国IP段内(chnroute/chnroute6)时,只采信上游代理 DNS 的应答..." - echolog " | - (chinadns-ng) 上游代理 DNS 有一定概率会比本地 DNS 先返回的话(比如上游代理 DNS 的本地查询缓存),启用 '公平模式' 可以优先接受本地 DNS 的中国IP段内(chnroute/chnroute6)的应答..." elif [ "$up_trust_chinadns_ng_dns" = "dns2socks" ]; then dns2socks_listen=${china_ng_gfw} - TUN_DNS="${dns2socks_listen}" + [ -n "${global}${chnlist}" ] && TUN_DNS="${dns2socks_listen}" msg="dns2socks" elif [ "$up_trust_chinadns_ng_dns" = "udp" ]; then use_udp_node_resolve_dns=1 - china_ng_gfw=${DNS_FORWARD} - [ -z "${returnhome}" ] || china_ng_chn="${china_ng_gfw}" + if [ -z "${returnhome}" ]; then + china_ng_gfw=${DNS_FORWARD} + else + china_ng_chn="${DNS_FORWARD}" + fi msg="udp" fi - cat "${RULES_PATH}/proxy_host" >> "${TMP_PATH}/gfwlist.txt" - echolog " | - [$?](chinadns-ng) 代理域名表合并到防火墙域名表" - gfwlist_param="${TMP_PATH}/gfwlist.txt" cp -a "${RULES_PATH}/chnlist" "${TMP_PATH}/chnlist" if [ -z "${returnhome}" ]; then cat "${RULES_PATH}/direct_host" >> "${TMP_PATH}/chnlist" echolog " | - [$?](chinadns-ng) 域名白名单合并到中国域名表" + cat "${RULES_PATH}/proxy_host" >> "${TMP_PATH}/gfwlist.txt" + echolog " | - [$?](chinadns-ng) 代理域名表合并到防火墙域名表" + gfwlist_param="${TMP_PATH}/gfwlist.txt" else echolog " | - (chinadns-ng) 白名单不与中国域名表合并" - china_ng_chn=${china_ng_gfw} cat "${RULES_PATH}/proxy_host" >> "${TMP_PATH}/chnlist" echolog " | - [$?](chinadns-ng) 忽略防火墙域名表,代理域名表合并到中国域名表" fi chnlist_param="${TMP_PATH}/chnlist" [ "$(config_t_get global fair_mode 1)" = "1" ] && extra_mode="-f" ln_start_bin "$(first_type chinadns-ng)" chinadns-ng -l "${DNS_PORT}" ${china_ng_chn:+-c "${china_ng_chn}"} ${chnlist_param:+-m "${chnlist_param}" -M} ${china_ng_gfw:+-t "${china_ng_gfw}"} ${gfwlist_param:+-g "${gfwlist_param}"} $extra_mode - echolog " + 过滤服务:ChinaDNS-NG(:${DNS_PORT}${extra_mode}):中国域名列表:${china_ng_chn:-D114.114.114.114},防火域名列表:${china_ng_gfw:-D8.8.8.8} ${msg}" + echolog " + 过滤服务:ChinaDNS-NG(:${DNS_PORT}${extra_mode}) + ${msg}:中国域名列表:${china_ng_chn:-D114.114.114.114},防火墙域名列表:${china_ng_gfw:-D8.8.8.8}" + [ -n "${global}${chnlist}" ] && [ -z "${returnhome}" ] && TUN_DNS="${china_ng_gfw}" ;; *) TUN_DNS="$(echo ${DNS_MODE} | sed 's/:/#/g')" @@ -703,6 +711,7 @@ start_dns() { dns2socks_listen=$(echo "${dns2socks_listen}" | sed 's/#/:/g') ln_start_bin "$(first_type dns2socks)" dns2socks "$dns2socks_socks_server" "$dns2socks_forward" "$dns2socks_listen" $dns2sock_cache echolog " - dns2sock(${dns2socks_listen}${dns2sock_cache}),${dns2socks_socks_server:-127.0.0.1:9050} -> ${dns2socks_forward-D46.182.19.48:53}" + [ "${DNS_MODE}" = "chinadns-ng" ] && [ -n "${global}${chnlist}" ] && [ -z "${returnhome}" ] && TUN_DNS="${dns2socks_listen}" fi [ "${use_udp_node_resolve_dns}" = "1" ] && echolog " * 要求代理 DNS 请求,如上游 DNS 非直连地址,确保 UDP 代理打开,并且已经正确转发" [ "${use_tcp_node_resolve_dns}" = "1" ] && echolog " * 请确认上游 DNS 支持 TCP 查询,如非直连地址,确保 TCP 代理打开,并且已经正确转发" @@ -733,7 +742,8 @@ add_dnsmasq() { fwd_dns="${LOCAL_DNS}" [ -z "${global}" ] && { - [ -z "${chnlist}" ] || [ -n "${returnhome}" ] && [ -n "${force_local}" ] && [ "${filtered_dns}" != "1" ] && unset fwd_dns + [ -z "${chnlist}" ] || [ -n "${returnhome}" ] && [ -n "${force_local}" ] && unset fwd_dns + [ "${DNS_MODE}" = "other_dns" ] && fwd_dns="${TUN_DNS}" sort -u "${RULES_PATH}/direct_host" | gen_dnsmasq_items "whitelist" "${fwd_dns}" "${TMP_DNSMASQ_PATH}/direct_host.conf" echolog " - [$?]域名白名单(whitelist):${fwd_dns:-默认}" } @@ -745,9 +755,8 @@ add_dnsmasq() { [ -n "${returnhome}" ] || [ "${filtered_dns}" = "1" ] && { [ -n "${gfwlist}" ] && fwd_dns="${LOCAL_DNS}" - [ "${filtered_dns}" = "1" ] && [ -z "${chnlist}" ] && unset fwd_dns - [ "${DNS_MODE}" = "chinadns-ng" ] && fwd_dns="127.0.0.1#${DNS_PORT}" [ -n "${returnhome}" ] && fwd_dns="${TUN_DNS}" + [ "${filtered_dns}" = "1" ] && [ -z "${chnlist}" ] && unset fwd_dns [ -n "${global}" ] && unset fwd_dns sort -u "${RULES_PATH}/chnlist" | gen_dnsmasq_items "chnroute" "${fwd_dns}" "${TMP_DNSMASQ_PATH}/chinalist_host.conf" echolog " - [$?]中国域名表(chnroute):${fwd_dns:-默认}" @@ -755,8 +764,8 @@ add_dnsmasq() { fwd_dns="${TUN_DNS}" [ "${filtered_dns}" = "1" ] && [ -z "${returnhome}" ] && unset fwd_dns - [ -n "${global}" ] && unset fwd_dns - sort -u "${RULES_PATH}/proxy_host" | sed 's/^\.\(.*\)$/\1/g' | gen_dnsmasq_items "blacklist" "${fwd_dns}" "${TMP_DNSMASQ_PATH}/proxy_host.conf" + [ "${DNS_MODE}" = "chinadns-ng" ] || [ -n "${global}" ] && [ -z "${returnhome}" ] && unset fwd_dns + sort -u "${RULES_PATH}/proxy_host" | gen_dnsmasq_items "blacklist" "${fwd_dns}" "${TMP_DNSMASQ_PATH}/proxy_host.conf" echolog " - [$?]代理域名表(blacklist):${fwd_dns:-默认}" [ -n "${gfwlist}" ] || [ "${filtered_dns}" = "1" ] && [ -z "${returnhome}" ] && { @@ -778,10 +787,12 @@ add_dnsmasq() { msg="ISP" servers="${LOCAL_DNS}" echo "conf-dir=${TMP_DNSMASQ_PATH}" > "/var/dnsmasq.d/dnsmasq-${CONFIG}.conf" - echo "conf-dir=$TMP_DNSMASQ_PATH" > "${DNSMASQ_PATH}/dnsmasq-${CONFIG}.conf" + echo "conf-dir=${TMP_DNSMASQ_PATH}" > "${DNSMASQ_PATH}/dnsmasq-${CONFIG}.conf" - [ "${filtered_dns}" = "1" ] && servers="${TUN_DNS}" - [ "${DNS_MODE}" = "chinadns-ng" ] && servers="127.0.0.1#${DNS_PORT}" && msg="chinadns-ng" + [ "${filtered_dns}" = "1" ] && [ -z "${returnhome}" ] && servers="${TUN_DNS}" + if [ "${DNS_MODE}" = "chinadns-ng" ]; then + [ -z "${global}${chnlist}" ] && servers="127.0.0.1#${DNS_PORT}" && msg="chinadns-ng" + fi [ -n "${chnlist}" ] && msg="中国列表以外" [ -n "${returnhome}" ] && msg="中国列表" [ -n "${global}" ] && msg="全局" diff --git a/package/lienol/luci-app-passwall/root/usr/share/passwall/iptables.sh b/package/lienol/luci-app-passwall/root/usr/share/passwall/iptables.sh index 8044841b4b..743372912a 100755 --- a/package/lienol/luci-app-passwall/root/usr/share/passwall/iptables.sh +++ b/package/lienol/luci-app-passwall/root/usr/share/passwall/iptables.sh @@ -145,7 +145,7 @@ load_acl() { eval tcp_port=\$TCP_REDIR_PORT$tcp_node eval TCP_NODE_TYPE=$(echo $(config_n_get $TCP_NODE type) | tr 'A-Z' 'a-z') [ "$TCP_NODE_TYPE" == "brook" ] && [ "$(config_n_get $TCP_NODE protocol client)" == "client" ] && is_tproxy=1 - [ "$TCP_NODE_TYPE" == "trojan-go" ] && is_tproxy=1 + #[ "$TCP_NODE_TYPE" == "trojan-go" ] && is_tproxy=1 msg2="${msg}使用TCP节点${tcp_node} [$(get_action_chain_name $tcp_proxy_mode)]" if [ -n "${is_tproxy}" ]; then msg2="${msg2}(TPROXY:${tcp_port})代理" @@ -191,7 +191,7 @@ load_acl() { [ "$TCP_NODE1" != "nil" ] && [ "$TCP_PROXY_MODE" != "disable" ] && { local TCP_NODE1_TYPE=$(echo $(config_n_get $TCP_NODE1 type) | tr 'A-Z' 'a-z') [ "$TCP_NODE1_TYPE" == "brook" ] && [ "$(config_n_get $TCP_NODE1 protocol client)" == "client" ] && is_tproxy=1 - [ "$TCP_NODE1_TYPE" == "trojan-go" ] && is_tproxy=1 + #[ "$TCP_NODE1_TYPE" == "trojan-go" ] && is_tproxy=1 msg="TCP默认代理:使用TCP节点1 [$(get_action_chain_name $TCP_PROXY_MODE)]" if [ -n "$is_tproxy" ]; then ipt_tmp=$ipt_m && is_tproxy="TPROXY" @@ -245,7 +245,7 @@ filter_node() { ip6t_tmp=$ip6t_n [ "$stream" == "udp" ] && is_tproxy=1 [ "$type" == "brook" ] && [ "$(config_n_get $node protocol client)" == "client" ] && is_tproxy=1 - [ "$type" == "trojan-go" ] && is_tproxy=1 + #[ "$type" == "trojan-go" ] && is_tproxy=1 if [ -n "$is_tproxy" ]; then ipt_tmp=$ipt_m ip6t_tmp=$ip6t_m diff --git a/package/lienol/luci-app-passwall/root/usr/share/passwall/subscribe.lua b/package/lienol/luci-app-passwall/root/usr/share/passwall/subscribe.lua index f3aa642d5e..14bae47287 100644 --- a/package/lienol/luci-app-passwall/root/usr/share/passwall/subscribe.lua +++ b/package/lienol/luci-app-passwall/root/usr/share/passwall/subscribe.lua @@ -339,7 +339,7 @@ local function processData(szType, content, add_mode) result.protocol = 'vmess' result.transport = info.net result.alter_id = info.aid - result.vmess_id = info.id + result.uuid = info.id result.remarks = info.ps -- result.mux = 1 -- result.mux_concurrency = 8 diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_uimage.c b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_uimage.c index 221e3a7ec1..7a9ec8acde 100644 --- a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_uimage.c +++ b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_uimage.c @@ -245,19 +245,15 @@ mtdsplit_uimage_parse_generic(struct mtd_info *master, uimage_verify_default); } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0) static const struct of_device_id mtdsplit_uimage_of_match_table[] = { { .compatible = "denx,uimage" }, {}, }; -#endif static struct mtd_part_parser uimage_generic_parser = { .owner = THIS_MODULE, .name = "uimage-fw", -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0) .of_match_table = mtdsplit_uimage_of_match_table, -#endif .parse_fn = mtdsplit_uimage_parse_generic, .type = MTD_PARSER_TYPE_FIRMWARE, }; @@ -312,19 +308,15 @@ mtdsplit_uimage_parse_netgear(struct mtd_info *master, uimage_verify_wndr3700); } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0) static const struct of_device_id mtdsplit_uimage_netgear_of_match_table[] = { { .compatible = "netgear,uimage" }, {}, }; -#endif static struct mtd_part_parser uimage_netgear_parser = { .owner = THIS_MODULE, .name = "netgear-fw", -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0) .of_match_table = mtdsplit_uimage_netgear_of_match_table, -#endif .parse_fn = mtdsplit_uimage_parse_netgear, .type = MTD_PARSER_TYPE_FIRMWARE, }; @@ -364,19 +356,15 @@ mtdsplit_uimage_parse_edimax(struct mtd_info *master, uimage_find_edimax); } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0) static const struct of_device_id mtdsplit_uimage_edimax_of_match_table[] = { { .compatible = "edimax,uimage" }, {}, }; -#endif static struct mtd_part_parser uimage_edimax_parser = { .owner = THIS_MODULE, .name = "edimax-fw", -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0) .of_match_table = mtdsplit_uimage_edimax_of_match_table, -#endif .parse_fn = mtdsplit_uimage_parse_edimax, .type = MTD_PARSER_TYPE_FIRMWARE, }; @@ -407,61 +395,53 @@ mtdsplit_uimage_parse_fonfxc(struct mtd_info *master, uimage_find_fonfxc); } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0) static const struct of_device_id mtdsplit_uimage_fonfxc_of_match_table[] = { { .compatible = "fonfxc,uimage" }, {}, }; -#endif static struct mtd_part_parser uimage_fonfxc_parser = { .owner = THIS_MODULE, .name = "fonfxc-fw", -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0) .of_match_table = mtdsplit_uimage_fonfxc_of_match_table, -#endif .parse_fn = mtdsplit_uimage_parse_fonfxc, }; /************************************************** - * ubootpad96 + * SGE (T&W) Shenzhen Gongjin Electronics **************************************************/ -#define ubootpad96_PAD_LEN 96 +#define SGE_PAD_LEN 96 -static ssize_t uimage_find_ubootpad96(u_char *buf, size_t len, int *extralen) +static ssize_t uimage_find_sge(u_char *buf, size_t len, int *extralen) { if (uimage_verify_default(buf, len, extralen) < 0) return -EINVAL; - *extralen = ubootpad96_PAD_LEN; + *extralen = SGE_PAD_LEN; return 0; } static int -mtdsplit_uimage_parse_ubootpad96(struct mtd_info *master, +mtdsplit_uimage_parse_sge(struct mtd_info *master, const struct mtd_partition **pparts, struct mtd_part_parser_data *data) { return __mtdsplit_parse_uimage(master, pparts, data, - uimage_find_ubootpad96); + uimage_find_sge); } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0) -static const struct of_device_id mtdsplit_uimage_ubootpad96_of_match_table[] = { - { .compatible = "ubootpad96,uimage" }, +static const struct of_device_id mtdsplit_uimage_sge_of_match_table[] = { + { .compatible = "sge,uimage" }, {}, }; -#endif -static struct mtd_part_parser uimage_ubootpad96_parser = { +static struct mtd_part_parser uimage_sge_parser = { .owner = THIS_MODULE, - .name = "ubootpad96-fw", -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0) - .of_match_table = mtdsplit_uimage_ubootpad96_of_match_table, -#endif - .parse_fn = mtdsplit_uimage_parse_ubootpad96, + .name = "sge-fw", + .of_match_table = mtdsplit_uimage_sge_of_match_table, + .parse_fn = mtdsplit_uimage_parse_sge, }; /************************************************** @@ -505,19 +485,15 @@ mtdsplit_uimage_parse_okli(struct mtd_info *master, uimage_verify_okli); } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0) static const struct of_device_id mtdsplit_uimage_okli_of_match_table[] = { { .compatible = "openwrt,okli" }, {}, }; -#endif static struct mtd_part_parser uimage_okli_parser = { .owner = THIS_MODULE, .name = "okli-fw", -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0) .of_match_table = mtdsplit_uimage_okli_of_match_table, -#endif .parse_fn = mtdsplit_uimage_parse_okli, }; @@ -531,7 +507,7 @@ static int __init mtdsplit_uimage_init(void) register_mtd_parser(&uimage_netgear_parser); register_mtd_parser(&uimage_edimax_parser); register_mtd_parser(&uimage_fonfxc_parser); - register_mtd_parser(&uimage_ubootpad96_parser); + register_mtd_parser(&uimage_sge_parser); register_mtd_parser(&uimage_okli_parser); return 0; diff --git a/target/linux/ipq806x/base-files/lib/upgrade/ruijie.sh b/target/linux/ipq806x/base-files/lib/upgrade/ruijie.sh index 2725de4326..46723ec5d3 100644 --- a/target/linux/ipq806x/base-files/lib/upgrade/ruijie.sh +++ b/target/linux/ipq806x/base-files/lib/upgrade/ruijie.sh @@ -1,6 +1,5 @@ # # Copyright (C) 2016 lede-project.org -# Copyright (C) 2020 AnYun # ruijie_do_flash() { diff --git a/target/linux/ipq806x/config-4.14 b/target/linux/ipq806x/config-4.14 index 5ce7ce5f8c..c2b8a357f8 100644 --- a/target/linux/ipq806x/config-4.14 +++ b/target/linux/ipq806x/config-4.14 @@ -1,4 +1,3 @@ -CONFIG_AHCI_IPQ=y CONFIG_ALIGNMENT_TRAP=y # CONFIG_AMBA_PL08X is not set # CONFIG_APQ_GCC_8084 is not set diff --git a/target/linux/ipq806x/patches-4.14/851-ata-add-sata-driver.patch b/target/linux/ipq806x/patches-4.14/851-ata-add-sata-driver.patch deleted file mode 100644 index 951fe4f74e..0000000000 --- a/target/linux/ipq806x/patches-4.14/851-ata-add-sata-driver.patch +++ /dev/null @@ -1,308 +0,0 @@ -From c5ea64dcf7b5d45e402e78b9f291d521669b7b80 Mon Sep 17 00:00:00 2001 -From: Kumar Gala -Date: Fri, 30 May 2014 15:35:40 -0500 -Subject: [PATCH] ata: Add Qualcomm ARM SoC AHCI SATA host controller driver - -Add support for the Qualcomm AHCI SATA controller that exists on several -SoC and specifically the IPQ806x family of chips. The IPQ806x SATA support -requires the associated IPQ806x SATA PHY Driver to be enabled as well. - -Signed-off-by: Kumar Gala -Signed-off-by: Gokul Sriram Palanisamy ---- - drivers/ata/ahci.h | 2 +- - drivers/ata/ahci_ipq.c | 248 ++++++++++++++++++++++++++++++++++++++ - drivers/ata/Kconfig | 8 ++++++++ - drivers/ata/Makefile | 1 + - 4 files changed, 258 insertions(+), 1 deletions(-) - create mode 100644 drivers/ata/ahci_ipq.c - ---- a/drivers/ata/ahci.h -+++ b/drivers/ata/ahci.h -@@ -54,7 +54,7 @@ - - enum { - AHCI_MAX_PORTS = 32, -- AHCI_MAX_CLKS = 5, -+ AHCI_MAX_CLKS = 6, - AHCI_MAX_SG = 168, /* hardware max is 64K */ - AHCI_DMA_BOUNDARY = 0xffffffff, - AHCI_MAX_CMDS = 32, ---- /dev/null -+++ b/drivers/ata/ahci_ipq.c -@@ -0,0 +1,248 @@ -+/* Copyright (c) 2015 - 2017, The Linux Foundation. All rights reserved. -+ * -+ * Permission to use, copy, modify, and/or distribute this software for any -+ * purpose with or without fee is hereby granted, provided that the above -+ * copyright notice and this permission notice appear in all copies. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "libata.h" -+#include "ahci.h" -+ -+#define IPQ_DRV_NAME "ahci-ipq" -+ -+struct ipq_ahci_priv { -+ struct platform_device *ahci_pdev; -+ struct ahci_host_priv *hpriv; -+ void *preg_reset; -+ int pstate; -+}; -+ -+struct ipq_ahci_priv *ipqpriv; -+ -+static const struct ata_port_info ipq_ahci_port_info = { -+ .flags = AHCI_FLAG_COMMON, -+ .pio_mask = ATA_PIO4, -+ .udma_mask = ATA_UDMA6, -+ .port_ops = &ahci_platform_ops, -+}; -+ -+static struct scsi_host_template ahci_platform_sht = { -+ AHCI_SHT(IPQ_DRV_NAME), -+}; -+ -+#define SATA_PWR_STATE_DOWN 0x1 -+#define SATA_PWR_STATE_UP 0x2 -+#define SATA_RESET 0x00902c1c -+ -+static void ipq_ahci_hard_reset(struct device *dev) -+{ -+ u32 reg; -+ -+ reg = readl_relaxed(ipqpriv->preg_reset); -+ writel_relaxed(reg | BIT(0), ipqpriv->preg_reset); -+ /* To make sure the write is complete before we move on */ -+ mb(); -+ -+ reg = readl_relaxed(ipqpriv->preg_reset); -+ writel_relaxed(reg & (~BIT(0)), ipqpriv->preg_reset); -+ /* To make sure the write is complete before we move on */ -+ mb(); -+} -+ -+static int ipq_ahci_suspend(struct device *dev) -+{ -+ struct ata_host *host = dev_get_drvdata(dev); -+ struct device_type *apt = &ata_port_type; -+ const struct dev_pm_ops *pm = apt->pm; -+ struct ata_port *ap; -+ int ret = 0, i; -+ -+ if (ipqpriv->pstate == SATA_PWR_STATE_UP) { -+ for (i = 0; i < host->n_ports; i++) { -+ ap = host->ports[i]; -+ /* Issue Port PM Suspend */ -+ ret = pm->runtime_suspend(&ap->tdev); -+ if (ret) { -+ dev_err(dev, "SATA controller port suspend failed\n"); -+ return ret; -+ } -+ } -+ -+ /* Issue Contoller PM Suspend */ -+ ret = ahci_platform_suspend_host(dev); -+ if (ret) { -+ dev_err(dev, "SATA controller host suspend failed\n"); -+ return ret; -+ } -+ -+ for (i = 0; i < ipqpriv->hpriv->nports; i++) { -+ if (!ipqpriv->hpriv->phys[i]) -+ continue; -+ -+ phy_power_off(ipqpriv->hpriv->phys[i]); -+ phy_exit(ipqpriv->hpriv->phys[i]); -+ } -+ -+ ahci_platform_disable_clks(ipqpriv->hpriv); -+ ipqpriv->pstate = SATA_PWR_STATE_DOWN; -+ } else { -+ dev_warn(dev, "SATA device already in suspended state"); -+ } -+ -+ return ret; -+} -+ -+static int ipq_ahci_resume(struct device *dev) -+{ -+ struct ata_host *host = dev_get_drvdata(dev); -+ struct device_type *apt = &ata_port_type; -+ const struct dev_pm_ops *pm = apt->pm; -+ struct ata_port *ap; -+ int ret = 0, i; -+ -+ if (ipqpriv->pstate == SATA_PWR_STATE_DOWN) { -+ -+ ahci_platform_enable_clks(ipqpriv->hpriv); -+ -+ /* Issue SATA clock hard reset */ -+ ipq_ahci_hard_reset(dev); -+ -+ for (i = 0; i < ipqpriv->hpriv->nports; i++) { -+ if (!ipqpriv->hpriv->phys[i]) -+ continue; -+ -+ phy_init(ipqpriv->hpriv->phys[i]); -+ phy_power_on(ipqpriv->hpriv->phys[i]); -+ } -+ -+ /* Issue Contoller PM Resume */ -+ ret = ahci_platform_resume_host(dev); -+ if (ret) { -+ dev_err(dev, "SATA controller resume failed\n"); -+ return ret; -+ } -+ -+ for (i = 0; i < host->n_ports; i++) { -+ /* Issue Port PM Resume */ -+ ap = host->ports[i]; -+ ret = pm->runtime_resume(&ap->tdev); -+ if (ret) { -+ dev_err(dev, "SATA controller port resume failed\n"); -+ return ret; -+ } -+ } -+ ipqpriv->pstate = SATA_PWR_STATE_UP; -+ } else { -+ dev_warn(dev, "SATA device already in resume state"); -+ } -+ -+ return ret; -+} -+ -+static int ipq_ahci_probe(struct platform_device *pdev) -+{ -+ struct device *dev = &pdev->dev; -+ struct ahci_host_priv *hpriv; -+ int rc; -+ -+ hpriv = ahci_platform_get_resources(pdev); -+ if (IS_ERR(hpriv)) -+ return PTR_ERR(hpriv); -+ -+ rc = ahci_platform_enable_resources(hpriv); -+ if (rc) -+ return rc; -+ -+ of_property_read_u32(dev->of_node, -+ "ports-implemented", &hpriv->force_port_map); -+ -+ rc = ahci_platform_init_host(pdev, hpriv, &ipq_ahci_port_info, -+ &ahci_platform_sht); -+ -+ if (rc) -+ goto disable_resources; -+ -+ ipqpriv = devm_kzalloc(dev, sizeof(*ipqpriv), GFP_KERNEL); -+ if (!ipqpriv) { -+ dev_err(dev, "can't alloc ahci_host_priv\n"); -+ rc = -ENOMEM; -+ goto disable_resources; -+ } -+ -+ ipqpriv->ahci_pdev = pdev; -+ ipqpriv->hpriv = hpriv; -+ ipqpriv->pstate = SATA_PWR_STATE_UP; -+ -+ ipqpriv->preg_reset = devm_ioremap(dev, SATA_RESET, -+ sizeof(*(ipqpriv->preg_reset))); -+ -+ if (IS_ERR(ipqpriv->preg_reset)) { -+ dev_err(dev, "can't ioremap for preg_reset\n"); -+ rc = -ENOMEM; -+ goto disable_resources; -+ } -+ -+ return 0; -+ -+ disable_resources: -+ ahci_platform_disable_resources(hpriv); -+ return rc; -+} -+ -+int ipq_ahci_remove(struct platform_device *pdev) -+{ -+ ata_platform_remove_one(pdev); -+ return 0; -+} -+ -+static SIMPLE_DEV_PM_OPS(ipq_ahci_pm_ops, ahci_platform_suspend, -+ ahci_platform_resume); -+ -+static const struct of_device_id ipq_ahci_of_match[] = { -+ { .compatible = "qcom,ipq806x-ahci", }, -+ {}, -+}; -+ -+MODULE_DEVICE_TABLE(of, ipq_ahci_of_match); -+ -+static const struct acpi_device_id ahci_acpi_match[] = { -+ { ACPI_DEVICE_CLASS(PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff) }, -+ {}, -+}; -+ -+MODULE_DEVICE_TABLE(acpi, ahci_acpi_match); -+ -+static struct platform_driver ipq_ahci_driver = { -+ .probe = ipq_ahci_probe, -+ .remove = ipq_ahci_remove, -+ .driver = { -+ .name = IPQ_DRV_NAME, -+ .of_match_table = ipq_ahci_of_match, -+ .acpi_match_table = ahci_acpi_match, -+ .pm = &ipq_ahci_pm_ops, -+ }, -+}; -+ -+module_platform_driver(ipq_ahci_driver); -+ -+MODULE_DESCRIPTION("IPQ806x AHCI SATA platform driver"); -+MODULE_ALIAS("platform:ahci-ipq"); -+MODULE_LICENSE("Dual BSD/GPL"); ---- a/drivers/ata/Kconfig -+++ b/drivers/ata/Kconfig -@@ -162,6 +162,14 @@ config AHCI_IMX - - If unsure, say N. - -+config AHCI_IPQ -+ tristate "Qualcomm Atheros IPQ806X AHCI SATA support" -+ help -+ This option enables support for the IPQ806X SoC's -+ onboard AHCI SATA. -+ -+ If unsure, say N. -+ - config AHCI_CEVA - tristate "CEVA AHCI SATA support" - depends on OF ---- a/drivers/ata/Makefile -+++ b/drivers/ata/Makefile -@@ -18,6 +18,7 @@ obj-$(CONFIG_AHCI_CEVA) += ahci_ceva.o - obj-$(CONFIG_AHCI_DA850) += ahci_da850.o libahci.o libahci_platform.o - obj-$(CONFIG_AHCI_DM816) += ahci_dm816.o libahci.o libahci_platform.o - obj-$(CONFIG_AHCI_IMX) += ahci_imx.o libahci.o libahci_platform.o -+obj-$(CONFIG_AHCI_IPQ) += ahci_ipq.o libahci.o libahci_platform.o - obj-$(CONFIG_AHCI_MTK) += ahci_mtk.o libahci.o libahci_platform.o - obj-$(CONFIG_AHCI_MVEBU) += ahci_mvebu.o libahci.o libahci_platform.o - obj-$(CONFIG_AHCI_OCTEON) += ahci_octeon.o diff --git a/target/linux/ramips/image/mt7621.mk b/target/linux/ramips/image/mt7621.mk index 8448c8f92c..4322aa4a63 100644 --- a/target/linux/ramips/image/mt7621.mk +++ b/target/linux/ramips/image/mt7621.mk @@ -81,11 +81,6 @@ define Build/iodata-mstc-header ) endef -define Build/ubootpad96 - uimage_padhdr -i $@ -o $@.new -l 96 - mv $@.new $@ -endef - define Build/ubnt-erx-factory-image if [ -e $(KDIR)/tmp/$(KERNEL_INITRAMFS_IMAGE) -a "$$(stat -c%s $@)" -lt "$(KERNEL_SIZE)" ]; then \ echo '21001:7' > $(1).compat; \