feat: add MPTCP support (#601)

This commit is contained in:
秋野かえで
2024-08-27 09:49:51 +08:00
committed by GitHub
parent 18b657083f
commit c5b596c293
12 changed files with 35 additions and 32 deletions

View File

@ -282,8 +282,10 @@ func (d *Dialer) ActivateCheck() {
func (d *Dialer) aliveBackground() {
cycle := d.CheckInterval
var tcpSomark uint32
var mptcp bool
if network, err := netproxy.ParseMagicNetwork(d.TcpCheckOptionRaw.ResolverNetwork); err == nil {
tcpSomark = network.Mark
mptcp = network.Mptcp
}
tcp4CheckOpt := &CheckOption{
networkType: &NetworkType{
@ -304,7 +306,7 @@ func (d *Dialer) aliveBackground() {
}).Debugln("Skip check due to no DNS record.")
return false, nil
}
return d.HttpCheck(ctx, opt.Url, opt.Ip4, opt.Method, tcpSomark)
return d.HttpCheck(ctx, opt.Url, opt.Ip4, opt.Method, tcpSomark, mptcp)
},
}
tcp6CheckOpt := &CheckOption{
@ -326,7 +328,7 @@ func (d *Dialer) aliveBackground() {
}).Debugln("Skip check due to no DNS record.")
return false, nil
}
return d.HttpCheck(ctx, opt.Url, opt.Ip6, opt.Method, tcpSomark)
return d.HttpCheck(ctx, opt.Url, opt.Ip6, opt.Method, tcpSomark, mptcp)
},
}
tcpNetwork := netproxy.MagicNetwork{
@ -580,7 +582,7 @@ func (d *Dialer) Check(opts *CheckOption) (ok bool, err error) {
return ok, err
}
func (d *Dialer) HttpCheck(ctx context.Context, u *netutils.URL, ip netip.Addr, method string, soMark uint32) (ok bool, err error) {
func (d *Dialer) HttpCheck(ctx context.Context, u *netutils.URL, ip netip.Addr, method string, soMark uint32, mptcp bool) (ok bool, err error) {
// HTTP(S) check.
if method == "" {
method = http.MethodGet
@ -590,7 +592,7 @@ func (d *Dialer) HttpCheck(ctx context.Context, u *netutils.URL, ip netip.Addr,
Transport: &http.Transport{
DialContext: func(ctx context.Context, network, addr string) (c net.Conn, err error) {
// Force to dial "ip".
conn, err := cd.DialContext(ctx, common.MagicNetwork("tcp", soMark), net.JoinHostPort(ip.String(), u.Port()))
conn, err := cd.DialContext(ctx, common.MagicNetwork("tcp", soMark, mptcp), net.JoinHostPort(ip.String(), u.Port()))
if err != nil {
return nil, err
}