diff --git a/.github/update.log b/.github/update.log index f52f08abf0..8bd4df99a3 100644 --- a/.github/update.log +++ b/.github/update.log @@ -1208,3 +1208,4 @@ Update On Sun Dec 7 19:36:46 CET 2025 Update On Mon Dec 8 19:42:31 CET 2025 Update On Tue Dec 9 19:39:21 CET 2025 Update On Wed Dec 10 19:41:17 CET 2025 +Update On Thu Dec 11 19:44:07 CET 2025 diff --git a/clash-meta/docs/config.yaml b/clash-meta/docs/config.yaml index cb76035fa8..26b1af2c90 100644 --- a/clash-meta/docs/config.yaml +++ b/clash-meta/docs/config.yaml @@ -1048,7 +1048,7 @@ proxies: # socks5 padding-min: 2 # 最小填充字节数 padding-max: 7 # 最大填充字节数 table-type: prefer_ascii # 可选值:prefer_ascii、prefer_entropy 前者全ascii映射,后者保证熵值(汉明1)低于3 - # custom-table: xpxvvpvv # 可选,自定义字节布局,必须包含2个x、2个p、4个v,可随意组合。启用此处则无需配置`table-type` + # custom-table: xpxvvpvv # 可选,自定义字节布局,必须包含2个x、2个p、4个v,可随意组合。启用此处则需配置`table-type`为`prefer_entropy` http-mask: true # 是否启用http掩码 enable-pure-downlink: false # 是否启用混淆下行,false的情况下能在保证数据安全的前提下极大提升下行速度,与服务端端保持相同(如果此处为false,则要求aead不可为none) @@ -1590,7 +1590,7 @@ listeners: padding-min: 1 # 填充最小长度 padding-max: 15 # 填充最大长度,均不建议过大 table-type: prefer_ascii # 可选值:prefer_ascii、prefer_entropy 前者全ascii映射,后者保证熵值(汉明1)低于3 - # custom-table: xpxvvpvv # 可选,自定义字节布局,必须包含2个x、2个p、4个v + # custom-table: xpxvvpvv # 可选,自定义字节布局,必须包含2个x、2个p、4个v,可随意组合。启用此处则需配置`table-type`为`prefer_entropy` handshake-timeout: 5 # optional enable-pure-downlink: false # 是否启用混淆下行,false的情况下能在保证数据安全的前提下极大提升下行速度,与客户端保持相同(如果此处为false,则要求aead不可为none) diff --git a/clash-meta/listener/config/sudoku.go b/clash-meta/listener/config/sudoku.go index b49e02557f..b581f3f5ce 100644 --- a/clash-meta/listener/config/sudoku.go +++ b/clash-meta/listener/config/sudoku.go @@ -1,6 +1,10 @@ package config -import "encoding/json" +import ( + "encoding/json" + + "github.com/metacubex/mihomo/listener/sing" +) // SudokuServer describes a Sudoku inbound server configuration. // It is internal to the listener layer and mainly used for logging and wiring. @@ -15,6 +19,9 @@ type SudokuServer struct { HandshakeTimeoutSecond *int `json:"handshake-timeout,omitempty"` EnablePureDownlink *bool `json:"enable-pure-downlink,omitempty"` CustomTable string `json:"custom-table,omitempty"` + + // mihomo private extension (not the part of standard Sudoku protocol) + MuxOption sing.MuxOption `json:"mux-option,omitempty"` } func (s SudokuServer) String() string { diff --git a/clash-meta/listener/inbound/sudoku.go b/clash-meta/listener/inbound/sudoku.go index be69dd395a..6c4092473c 100644 --- a/clash-meta/listener/inbound/sudoku.go +++ b/clash-meta/listener/inbound/sudoku.go @@ -21,6 +21,9 @@ type SudokuOption struct { HandshakeTimeoutSecond *int `inbound:"handshake-timeout,omitempty"` EnablePureDownlink *bool `inbound:"enable-pure-downlink,omitempty"` CustomTable string `inbound:"custom-table,omitempty"` // optional custom byte layout, e.g. xpxvvpvv + + // mihomo private extension (not the part of standard Sudoku protocol) + MuxOption MuxOption `inbound:"mux-option,omitempty"` } func (o SudokuOption) Equal(config C.InboundConfig) bool { @@ -55,6 +58,7 @@ func NewSudoku(options *SudokuOption) (*Sudoku, error) { EnablePureDownlink: options.EnablePureDownlink, CustomTable: options.CustomTable, } + serverConf.MuxOption = options.MuxOption.Build() return &Sudoku{ Base: base, diff --git a/clash-meta/listener/inbound/sudoku_test.go b/clash-meta/listener/inbound/sudoku_test.go index c3fbcc6f63..6ba9e63b6b 100644 --- a/clash-meta/listener/inbound/sudoku_test.go +++ b/clash-meta/listener/inbound/sudoku_test.go @@ -50,6 +50,8 @@ func testInboundSudoku(t *testing.T, inboundOptions inbound.SudokuOption, outbou defer out.Close() tunnel.DoTest(t, out) + + testSingMux(t, tunnel, out) } func TestInboundSudoku_Basic(t *testing.T) { diff --git a/clash-meta/listener/sudoku/server.go b/clash-meta/listener/sudoku/server.go index 072f372b0f..8351e36597 100644 --- a/clash-meta/listener/sudoku/server.go +++ b/clash-meta/listener/sudoku/server.go @@ -9,6 +9,7 @@ import ( "github.com/metacubex/mihomo/adapter/inbound" C "github.com/metacubex/mihomo/constant" LC "github.com/metacubex/mihomo/listener/config" + "github.com/metacubex/mihomo/listener/sing" "github.com/metacubex/mihomo/log" "github.com/metacubex/mihomo/transport/socks5" "github.com/metacubex/mihomo/transport/sudoku" @@ -19,6 +20,7 @@ type Listener struct { addr string closed bool protoConf sudoku.ProtocolConfig + handler *sing.ListenerHandler } // RawAddress implements C.Listener @@ -59,7 +61,8 @@ func (l *Listener) handleConn(conn net.Conn, tunnel C.Tunnel, additions ...inbou _ = session.Conn.Close() return } - tunnel.HandleTCPConn(inbound.NewSocket(targetAddr, session.Conn, C.SUDOKU, additions...)) + l.handler.HandleSocket(targetAddr, session.Conn, additions...) + //tunnel.HandleTCPConn(inbound.NewSocket(targetAddr, session.Conn, C.SUDOKU, additions...)) } } @@ -122,6 +125,17 @@ func New(config LC.SudokuServer, tunnel C.Tunnel, additions ...inbound.Addition) } } + // Using sing handler for sing-mux support + h, err := sing.NewListenerHandler(sing.ListenerConfig{ + Tunnel: tunnel, + Type: C.SUDOKU, + Additions: additions, + MuxOption: config.MuxOption, + }) + if err != nil { + return nil, err + } + l, err := inbound.Listen("tcp", config.Listen) if err != nil { return nil, err @@ -180,6 +194,7 @@ func New(config LC.SudokuServer, tunnel C.Tunnel, additions ...inbound.Addition) listener: l, addr: config.Listen, protoConf: protoConf, + handler: h, } go func() { diff --git a/clash-meta/transport/vmess/websocket.go b/clash-meta/transport/vmess/websocket.go index 8fe436328d..07fb9d6ad1 100644 --- a/clash-meta/transport/vmess/websocket.go +++ b/clash-meta/transport/vmess/websocket.go @@ -362,7 +362,7 @@ func streamWebsocketConn(ctx context.Context, conn net.Conn, c *WebsocketConfig, if err != nil { return nil, err } - tlsConn := tlsC.UClient(conn, tlsC.UConfig(config), clientFingerprint) + tlsConn := tlsC.UClient(conn, tlsConfig, clientFingerprint) if err = tlsC.BuildWebsocketHandshakeState(tlsConn); err != nil { return nil, fmt.Errorf("parse url %s error: %w", c.Path, err) } diff --git a/clash-nyanpasu/manifest/version.json b/clash-nyanpasu/manifest/version.json index 4692bbf3db..07792ee95d 100644 --- a/clash-nyanpasu/manifest/version.json +++ b/clash-nyanpasu/manifest/version.json @@ -2,7 +2,7 @@ "manifest_version": 1, "latest": { "mihomo": "v1.19.17", - "mihomo_alpha": "alpha-17b8eb8", + "mihomo_alpha": "alpha-2211789", "clash_rs": "v0.9.3", "clash_premium": "2023-09-05-gdcc8d87", "clash_rs_alpha": "0.9.3-alpha+sha.a6538ac" @@ -69,5 +69,5 @@ "linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf" } }, - "updated_at": "2025-12-09T22:21:41.769Z" + "updated_at": "2025-12-10T22:21:46.086Z" } diff --git a/lede/feeds.conf.default b/lede/feeds.conf.default index 90755bdc19..3cb8df49e5 100644 --- a/lede/feeds.conf.default +++ b/lede/feeds.conf.default @@ -1,6 +1,6 @@ src-git packages https://github.com/coolsnowwolf/packages #src-git luci https://github.com/coolsnowwolf/luci.git -src-git luci https://github.com/coolsnowwolf/luci.git;openwrt-23.05 +src-git luci https://github.com/coolsnowwolf/luci.git;openwrt-25.12 #src-git luci https://github.com/coolsnowwolf/luci.git;openwrt-24.10 src-git routing https://github.com/coolsnowwolf/routing src-git telephony https://github.com/coolsnowwolf/telephony.git diff --git a/lede/include/version.mk b/lede/include/version.mk index abd7bce7f3..8f3b93aa50 100644 --- a/lede/include/version.mk +++ b/lede/include/version.mk @@ -23,13 +23,13 @@ PKG_CONFIG_DEPENDS += \ sanitize = $(call tolower,$(subst _,-,$(subst $(space),-,$(1)))) VERSION_NUMBER:=$(call qstrip,$(CONFIG_VERSION_NUMBER)) -VERSION_NUMBER:=$(if $(VERSION_NUMBER),$(VERSION_NUMBER),24.10.3) +VERSION_NUMBER:=$(if $(VERSION_NUMBER),$(VERSION_NUMBER),25.12-SNAPSHOT) VERSION_CODE:=$(call qstrip,$(CONFIG_VERSION_CODE)) VERSION_CODE:=$(if $(VERSION_CODE),$(VERSION_CODE),$(REVISION)) VERSION_REPO:=$(call qstrip,$(CONFIG_VERSION_REPO)) -VERSION_REPO:=$(if $(VERSION_REPO),$(VERSION_REPO),https://downloads.openwrt.org/releases/24.10.3) +VERSION_REPO:=$(if $(VERSION_REPO),$(VERSION_REPO),https://downloads.openwrt.org/releases/25.12-SNAPSHOT) VERSION_DIST:=$(call qstrip,$(CONFIG_VERSION_DIST)) VERSION_DIST:=$(if $(VERSION_DIST),$(VERSION_DIST),OpenWrt) diff --git a/lede/package/base-files/image-config.in b/lede/package/base-files/image-config.in index 73c62b349a..2cc8a8b2ac 100644 --- a/lede/package/base-files/image-config.in +++ b/lede/package/base-files/image-config.in @@ -190,7 +190,7 @@ if VERSIONOPT config VERSION_REPO string prompt "Release repository" - default "https://downloads.openwrt.org/releases/24.10.3" + default "https://downloads.openwrt.org/releases/25.12-SNAPSHOT" help This is the repository address embedded in the image, it defaults to the trunk snapshot repo; the url may contain the following placeholders: diff --git a/lede/package/kernel/linux/modules/i2c.mk b/lede/package/kernel/linux/modules/i2c.mk index 324a59dda9..c734f868d5 100644 --- a/lede/package/kernel/linux/modules/i2c.mk +++ b/lede/package/kernel/linux/modules/i2c.mk @@ -256,6 +256,22 @@ endef $(eval $(call KernelPackage,i2c-mux-mlxcpld)) +I2C_MUX_PINCTRL_MODULES:= \ + CONFIG_I2C_MUX_PINCTRL:drivers/i2c/muxes/i2c-mux-pinctrl + +define KernelPackage/i2c-mux-pinctrl + $(call i2c_defaults,$(I2C_MUX_PINCTRL_MODULES),51) + TITLE:=Pinctrl-based I2C mux/switches + DEPENDS:=@PINCTRL_SUPPORT @USES_DEVICETREE +kmod-i2c-mux +endef + +define KernelPackage/i2c-mux-pinctrl/description + Kernel modules for Pinctrl-based I2C bus mux/switching devices +endef + +$(eval $(call KernelPackage,i2c-mux-pinctrl)) + + I2C_MUX_REG_MODULES:= \ CONFIG_I2C_MUX_REG:drivers/i2c/muxes/i2c-mux-reg diff --git a/mihomo/docs/config.yaml b/mihomo/docs/config.yaml index cb76035fa8..26b1af2c90 100644 --- a/mihomo/docs/config.yaml +++ b/mihomo/docs/config.yaml @@ -1048,7 +1048,7 @@ proxies: # socks5 padding-min: 2 # 最小填充字节数 padding-max: 7 # 最大填充字节数 table-type: prefer_ascii # 可选值:prefer_ascii、prefer_entropy 前者全ascii映射,后者保证熵值(汉明1)低于3 - # custom-table: xpxvvpvv # 可选,自定义字节布局,必须包含2个x、2个p、4个v,可随意组合。启用此处则无需配置`table-type` + # custom-table: xpxvvpvv # 可选,自定义字节布局,必须包含2个x、2个p、4个v,可随意组合。启用此处则需配置`table-type`为`prefer_entropy` http-mask: true # 是否启用http掩码 enable-pure-downlink: false # 是否启用混淆下行,false的情况下能在保证数据安全的前提下极大提升下行速度,与服务端端保持相同(如果此处为false,则要求aead不可为none) @@ -1590,7 +1590,7 @@ listeners: padding-min: 1 # 填充最小长度 padding-max: 15 # 填充最大长度,均不建议过大 table-type: prefer_ascii # 可选值:prefer_ascii、prefer_entropy 前者全ascii映射,后者保证熵值(汉明1)低于3 - # custom-table: xpxvvpvv # 可选,自定义字节布局,必须包含2个x、2个p、4个v + # custom-table: xpxvvpvv # 可选,自定义字节布局,必须包含2个x、2个p、4个v,可随意组合。启用此处则需配置`table-type`为`prefer_entropy` handshake-timeout: 5 # optional enable-pure-downlink: false # 是否启用混淆下行,false的情况下能在保证数据安全的前提下极大提升下行速度,与客户端保持相同(如果此处为false,则要求aead不可为none) diff --git a/mihomo/listener/config/sudoku.go b/mihomo/listener/config/sudoku.go index b49e02557f..b581f3f5ce 100644 --- a/mihomo/listener/config/sudoku.go +++ b/mihomo/listener/config/sudoku.go @@ -1,6 +1,10 @@ package config -import "encoding/json" +import ( + "encoding/json" + + "github.com/metacubex/mihomo/listener/sing" +) // SudokuServer describes a Sudoku inbound server configuration. // It is internal to the listener layer and mainly used for logging and wiring. @@ -15,6 +19,9 @@ type SudokuServer struct { HandshakeTimeoutSecond *int `json:"handshake-timeout,omitempty"` EnablePureDownlink *bool `json:"enable-pure-downlink,omitempty"` CustomTable string `json:"custom-table,omitempty"` + + // mihomo private extension (not the part of standard Sudoku protocol) + MuxOption sing.MuxOption `json:"mux-option,omitempty"` } func (s SudokuServer) String() string { diff --git a/mihomo/listener/inbound/sudoku.go b/mihomo/listener/inbound/sudoku.go index be69dd395a..6c4092473c 100644 --- a/mihomo/listener/inbound/sudoku.go +++ b/mihomo/listener/inbound/sudoku.go @@ -21,6 +21,9 @@ type SudokuOption struct { HandshakeTimeoutSecond *int `inbound:"handshake-timeout,omitempty"` EnablePureDownlink *bool `inbound:"enable-pure-downlink,omitempty"` CustomTable string `inbound:"custom-table,omitempty"` // optional custom byte layout, e.g. xpxvvpvv + + // mihomo private extension (not the part of standard Sudoku protocol) + MuxOption MuxOption `inbound:"mux-option,omitempty"` } func (o SudokuOption) Equal(config C.InboundConfig) bool { @@ -55,6 +58,7 @@ func NewSudoku(options *SudokuOption) (*Sudoku, error) { EnablePureDownlink: options.EnablePureDownlink, CustomTable: options.CustomTable, } + serverConf.MuxOption = options.MuxOption.Build() return &Sudoku{ Base: base, diff --git a/mihomo/listener/inbound/sudoku_test.go b/mihomo/listener/inbound/sudoku_test.go index c3fbcc6f63..6ba9e63b6b 100644 --- a/mihomo/listener/inbound/sudoku_test.go +++ b/mihomo/listener/inbound/sudoku_test.go @@ -50,6 +50,8 @@ func testInboundSudoku(t *testing.T, inboundOptions inbound.SudokuOption, outbou defer out.Close() tunnel.DoTest(t, out) + + testSingMux(t, tunnel, out) } func TestInboundSudoku_Basic(t *testing.T) { diff --git a/mihomo/listener/sudoku/server.go b/mihomo/listener/sudoku/server.go index 072f372b0f..8351e36597 100644 --- a/mihomo/listener/sudoku/server.go +++ b/mihomo/listener/sudoku/server.go @@ -9,6 +9,7 @@ import ( "github.com/metacubex/mihomo/adapter/inbound" C "github.com/metacubex/mihomo/constant" LC "github.com/metacubex/mihomo/listener/config" + "github.com/metacubex/mihomo/listener/sing" "github.com/metacubex/mihomo/log" "github.com/metacubex/mihomo/transport/socks5" "github.com/metacubex/mihomo/transport/sudoku" @@ -19,6 +20,7 @@ type Listener struct { addr string closed bool protoConf sudoku.ProtocolConfig + handler *sing.ListenerHandler } // RawAddress implements C.Listener @@ -59,7 +61,8 @@ func (l *Listener) handleConn(conn net.Conn, tunnel C.Tunnel, additions ...inbou _ = session.Conn.Close() return } - tunnel.HandleTCPConn(inbound.NewSocket(targetAddr, session.Conn, C.SUDOKU, additions...)) + l.handler.HandleSocket(targetAddr, session.Conn, additions...) + //tunnel.HandleTCPConn(inbound.NewSocket(targetAddr, session.Conn, C.SUDOKU, additions...)) } } @@ -122,6 +125,17 @@ func New(config LC.SudokuServer, tunnel C.Tunnel, additions ...inbound.Addition) } } + // Using sing handler for sing-mux support + h, err := sing.NewListenerHandler(sing.ListenerConfig{ + Tunnel: tunnel, + Type: C.SUDOKU, + Additions: additions, + MuxOption: config.MuxOption, + }) + if err != nil { + return nil, err + } + l, err := inbound.Listen("tcp", config.Listen) if err != nil { return nil, err @@ -180,6 +194,7 @@ func New(config LC.SudokuServer, tunnel C.Tunnel, additions ...inbound.Addition) listener: l, addr: config.Listen, protoConf: protoConf, + handler: h, } go func() { diff --git a/mihomo/transport/vmess/websocket.go b/mihomo/transport/vmess/websocket.go index 8fe436328d..07fb9d6ad1 100644 --- a/mihomo/transport/vmess/websocket.go +++ b/mihomo/transport/vmess/websocket.go @@ -362,7 +362,7 @@ func streamWebsocketConn(ctx context.Context, conn net.Conn, c *WebsocketConfig, if err != nil { return nil, err } - tlsConn := tlsC.UClient(conn, tlsC.UConfig(config), clientFingerprint) + tlsConn := tlsC.UClient(conn, tlsConfig, clientFingerprint) if err = tlsC.BuildWebsocketHandshakeState(tlsConn); err != nil { return nil, fmt.Errorf("parse url %s error: %w", c.Path, err) } diff --git a/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/cbi/nodes_multiselect.htm b/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/cbi/nodes_multiselect.htm index dd39c6c52f..de951198df 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/cbi/nodes_multiselect.htm +++ b/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/cbi/nodes_multiselect.htm @@ -48,16 +48,15 @@ end