mirror of
https://github.com/daeuniverse/dae.git
synced 2025-07-06 08:22:38 +07:00
style/optimize: refine log; udp lazily call group.Select()
This commit is contained in:
@ -49,14 +49,19 @@ func (c *ControlPlane) handleConn(lConn net.Conn) (err error) {
|
|||||||
outbound := c.outbounds[value.Outbound]
|
outbound := c.outbounds[value.Outbound]
|
||||||
// TODO: Set-up ip to domain mapping and show domain if possible.
|
// TODO: Set-up ip to domain mapping and show domain if possible.
|
||||||
src := lConn.RemoteAddr().(*net.TCPAddr).AddrPort()
|
src := lConn.RemoteAddr().(*net.TCPAddr).AddrPort()
|
||||||
c.log.WithFields(logrus.Fields{
|
|
||||||
"l4proto": "TCP",
|
|
||||||
"outbound": outbound.Name,
|
|
||||||
}).Infof("%v <-> %v", RefineSourceToShow(src, dst.Addr()), RefineAddrPortToShow(dst))
|
|
||||||
if value.Outbound < 0 || int(value.Outbound) >= len(c.outbounds) {
|
if value.Outbound < 0 || int(value.Outbound) >= len(c.outbounds) {
|
||||||
return fmt.Errorf("outbound id from bpf is out of range: %v not in [0, %v]", value.Outbound, len(c.outbounds)-1)
|
return fmt.Errorf("outbound id from bpf is out of range: %v not in [0, %v]", value.Outbound, len(c.outbounds)-1)
|
||||||
}
|
}
|
||||||
rConn, err := outbound.Dial("tcp", dst.String())
|
dialer, err := outbound.Select()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to select dialer from group %v: %w", outbound.Name, err)
|
||||||
|
}
|
||||||
|
c.log.WithFields(logrus.Fields{
|
||||||
|
"l4proto": "TCP",
|
||||||
|
"outbound": outbound.Name,
|
||||||
|
"dialer": dialer.Name(),
|
||||||
|
}).Infof("%v <-> %v", RefineSourceToShow(src, dst.Addr()), RefineAddrPortToShow(dst))
|
||||||
|
rConn, err := dialer.Dial("tcp", dst.String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to dial %v: %w", dst, err)
|
return fmt.Errorf("failed to dial %v: %w", dst, err)
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import (
|
|||||||
"github.com/mzz2017/softwind/pool"
|
"github.com/mzz2017/softwind/pool"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"github.com/v2rayA/dae/common/consts"
|
"github.com/v2rayA/dae/common/consts"
|
||||||
|
"github.com/v2rayA/dae/component/outbound/dialer"
|
||||||
"golang.org/x/net/dns/dnsmessage"
|
"golang.org/x/net/dns/dnsmessage"
|
||||||
"net"
|
"net"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
@ -120,43 +121,59 @@ func (c *ControlPlane) handlePkt(data []byte, lConn *net.UDPConn, lAddrPort neti
|
|||||||
}
|
}
|
||||||
if c.log.IsLevelEnabled(logrus.DebugLevel) && len(dnsMessage.Questions) > 0 {
|
if c.log.IsLevelEnabled(logrus.DebugLevel) && len(dnsMessage.Questions) > 0 {
|
||||||
q := dnsMessage.Questions[0]
|
q := dnsMessage.Questions[0]
|
||||||
c.log.Debugf("UDP(DNS) %v <-[%v]-> Cache: %v %v",
|
c.log.Tracef("UDP(DNS) %v <-[%v]-> Cache: %v %v",
|
||||||
RefineSourceToShow(lAddrPort, dest.Addr()), outbound.Name, q.Name, q.Type,
|
RefineSourceToShow(lAddrPort, dest.Addr()), outbound.Name, q.Name, q.Type,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
} else {
|
} else {
|
||||||
c.log.Debugf("Modify dns target %v to upstream: %v", RefineAddrPortToShow(dest), c.dnsUpstream)
|
c.log.Tracef("Modify dns target %v to upstream: %v", RefineAddrPortToShow(dest), c.dnsUpstream)
|
||||||
// Modify dns target to upstream.
|
// Modify dns target to upstream.
|
||||||
// NOTICE: Routing was calculated in advance by the eBPF program.
|
// NOTICE: Routing was calculated in advance by the eBPF program.
|
||||||
dummyFrom = &addrHdr.Dest
|
dummyFrom = &addrHdr.Dest
|
||||||
dest = c.dnsUpstream
|
dest = c.dnsUpstream
|
||||||
|
|
||||||
if c.log.IsLevelEnabled(logrus.DebugLevel) && len(dnsMessage.Questions) > 0 {
|
|
||||||
q := dnsMessage.Questions[0]
|
|
||||||
c.log.Debugf("UDP(DNS) %v <-[%v]-> %v: %v %v",
|
|
||||||
RefineSourceToShow(lAddrPort, addrHdr.Dest.Addr()), outbound.Name, RefineAddrPortToShow(dest), q.Name, q.Type,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ue, err := DefaultUdpEndpointPool.GetOrCreate(lAddrPort, &UdpEndpointOptions{
|
||||||
|
Handler: c.RelayToUDP(lConn, lAddrPort, isDns, dummyFrom),
|
||||||
|
NatTimeout: natTimeout,
|
||||||
|
DialerFunc: func() (*dialer.Dialer, error) {
|
||||||
|
newDialer, err := outbound.Select()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to select dialer from group %v: %w", outbound.Name, err)
|
||||||
|
}
|
||||||
|
return newDialer, nil
|
||||||
|
},
|
||||||
|
Target: dest,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to GetOrCreate: %w", err)
|
||||||
|
}
|
||||||
|
// This is real dialer.
|
||||||
|
d := ue.Dialer
|
||||||
|
|
||||||
|
if isDns && c.log.IsLevelEnabled(logrus.DebugLevel) && len(dnsMessage.Questions) > 0 {
|
||||||
|
q := dnsMessage.Questions[0]
|
||||||
|
c.log.WithFields(logrus.Fields{
|
||||||
|
"l4proto": "UDP(DNS)",
|
||||||
|
"outbound": outbound.Name,
|
||||||
|
"dialer": d.Name(),
|
||||||
|
"qname": q.Name,
|
||||||
|
"qtype": q.Type,
|
||||||
|
}).Infof("%v <-> %v",
|
||||||
|
RefineSourceToShow(lAddrPort, dest.Addr()), RefineAddrPortToShow(dest),
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
// TODO: Set-up ip to domain mapping and show domain if possible.
|
// TODO: Set-up ip to domain mapping and show domain if possible.
|
||||||
c.log.WithFields(logrus.Fields{
|
c.log.WithFields(logrus.Fields{
|
||||||
"l4proto": "UDP",
|
"l4proto": "UDP",
|
||||||
"outbound": outbound.Name,
|
"outbound": outbound.Name,
|
||||||
|
"dialer": d.Name(),
|
||||||
}).Infof("%v <-> %v",
|
}).Infof("%v <-> %v",
|
||||||
RefineSourceToShow(lAddrPort, dest.Addr()), RefineAddrPortToShow(dest),
|
RefineSourceToShow(lAddrPort, dest.Addr()), RefineAddrPortToShow(dest),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
ue, err := DefaultUdpEndpointPool.GetOrCreate(lAddrPort, &UdpEndpointOptions{
|
|
||||||
Handler: c.RelayToUDP(lConn, lAddrPort, isDns, dummyFrom),
|
|
||||||
NatTimeout: natTimeout,
|
|
||||||
Dialer: outbound,
|
|
||||||
Target: dest,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to GetOrCreate: %w", err)
|
|
||||||
}
|
|
||||||
//log.Printf("WriteToUDPAddrPort->%v", dest)
|
//log.Printf("WriteToUDPAddrPort->%v", dest)
|
||||||
_, err = ue.WriteToUDPAddrPort(data, dest)
|
_, err = ue.WriteToUDPAddrPort(data, dest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -8,7 +8,7 @@ package control
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/mzz2017/softwind/pool"
|
"github.com/mzz2017/softwind/pool"
|
||||||
"golang.org/x/net/proxy"
|
"github.com/v2rayA/dae/component/outbound/dialer"
|
||||||
"net"
|
"net"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"sync"
|
"sync"
|
||||||
@ -24,6 +24,8 @@ type UdpEndpoint struct {
|
|||||||
deadlineTimer *time.Timer
|
deadlineTimer *time.Timer
|
||||||
handler UdpHandler
|
handler UdpHandler
|
||||||
NatTimeout time.Duration
|
NatTimeout time.Duration
|
||||||
|
|
||||||
|
Dialer *dialer.Dialer
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ue *UdpEndpoint) start() {
|
func (ue *UdpEndpoint) start() {
|
||||||
@ -67,7 +69,7 @@ type UdpEndpointPool struct {
|
|||||||
type UdpEndpointOptions struct {
|
type UdpEndpointOptions struct {
|
||||||
Handler UdpHandler
|
Handler UdpHandler
|
||||||
NatTimeout time.Duration
|
NatTimeout time.Duration
|
||||||
Dialer proxy.Dialer
|
DialerFunc func() (*dialer.Dialer, error)
|
||||||
// Target is useful only if the underlay does not support Full-cone.
|
// Target is useful only if the underlay does not support Full-cone.
|
||||||
Target netip.AddrPort
|
Target netip.AddrPort
|
||||||
}
|
}
|
||||||
@ -96,7 +98,12 @@ func (p *UdpEndpointPool) GetOrCreate(lAddr netip.AddrPort, createOption *UdpEnd
|
|||||||
return nil, fmt.Errorf("createOption.Handler cannot be nil")
|
return nil, fmt.Errorf("createOption.Handler cannot be nil")
|
||||||
}
|
}
|
||||||
|
|
||||||
udpConn, err := createOption.Dialer.Dial("udp", createOption.Target.String())
|
d, err := createOption.DialerFunc()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
udpConn, err := d.Dial("udp", createOption.Target.String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -112,6 +119,7 @@ func (p *UdpEndpointPool) GetOrCreate(lAddr netip.AddrPort, createOption *UdpEnd
|
|||||||
}),
|
}),
|
||||||
handler: createOption.Handler,
|
handler: createOption.Handler,
|
||||||
NatTimeout: createOption.NatTimeout,
|
NatTimeout: createOption.NatTimeout,
|
||||||
|
Dialer: d,
|
||||||
}
|
}
|
||||||
p.pool[lAddr] = ue
|
p.pool[lAddr] = ue
|
||||||
// Receive UDP messages.
|
// Receive UDP messages.
|
||||||
|
@ -164,7 +164,7 @@ func (a *AliveDialerSet) SetAlive(dialer *Dialer, alive bool) {
|
|||||||
a.log.WithFields(logrus.Fields{
|
a.log.WithFields(logrus.Fields{
|
||||||
"group": a.dialerGroupName,
|
"group": a.dialerGroupName,
|
||||||
"dialer": a.minLatency.dialer.Name(),
|
"dialer": a.minLatency.dialer.Name(),
|
||||||
}).Infof("Group re-selects dialer")
|
}).Infof("Group selects dialer")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -117,6 +117,5 @@ func (g *DialerGroup) Dial(network string, addr string) (c net.Conn, err error)
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
g.log.Tracef("Group [%v] dial using <%v>", g.Name, d.Name())
|
|
||||||
return d.Dial(network, addr)
|
return d.Dial(network, addr)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user