mirror of
https://github.com/daeuniverse/dae.git
synced 2025-07-12 08:49:53 +07:00
style: better connection trace output
This commit is contained in:
@ -124,7 +124,10 @@ const (
|
|||||||
LoopbackIfIndex = 1
|
LoopbackIfIndex = 1
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type LanWanFlag uint8
|
||||||
|
|
||||||
const (
|
const (
|
||||||
IsWan = 0
|
LanWanFlag_IsWan LanWanFlag = iota
|
||||||
IsLan = 1
|
LanWanFlag_IsLan
|
||||||
|
LanWanFlag_NotApplicable
|
||||||
)
|
)
|
||||||
|
@ -6,13 +6,14 @@
|
|||||||
package control
|
package control
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/v2rayA/dae/common/consts"
|
||||||
"net"
|
"net"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
func RefineSourceToShow(src netip.AddrPort, dAddr netip.Addr) (srcToShow string) {
|
func RefineSourceToShow(src netip.AddrPort, dst netip.Addr, lanWanFlag consts.LanWanFlag) (srcToShow string) {
|
||||||
if src.Addr() == dAddr {
|
if lanWanFlag == consts.LanWanFlag_IsWan || src.Addr() == dst {
|
||||||
// If nothing else, this means this packet is sent from localhost.
|
// If nothing else, this means this packet is sent from localhost.
|
||||||
return net.JoinHostPort("localhost", strconv.Itoa(int(src.Port())))
|
return net.JoinHostPort("localhost", strconv.Itoa(int(src.Port())))
|
||||||
} else {
|
} else {
|
||||||
|
@ -74,7 +74,7 @@ func (c *ControlPlane) handleConn(lConn net.Conn) (err error) {
|
|||||||
"network": networkType.String(),
|
"network": networkType.String(),
|
||||||
"outbound": outbound.Name,
|
"outbound": outbound.Name,
|
||||||
"dialer": d.Name(),
|
"dialer": d.Name(),
|
||||||
}).Infof("%v <-> %v", RefineSourceToShow(src, dst.Addr()), RefineAddrPortToShow(dst))
|
}).Infof("%v <-> %v", RefineSourceToShow(src, dst.Addr(), consts.LanWanFlag_NotApplicable), RefineAddrPortToShow(dst))
|
||||||
rConn, err := d.Dial("tcp", dst.String())
|
rConn, err := d.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)
|
||||||
|
@ -72,10 +72,10 @@ func (hdr *AddrHdr) ToBytesFromPool() []byte {
|
|||||||
return buf
|
return buf
|
||||||
}
|
}
|
||||||
|
|
||||||
func sendPktWithHdrWithFlag(data []byte, from netip.AddrPort, lConn *net.UDPConn, to netip.AddrPort, lanWanFlag uint8) error {
|
func sendPktWithHdrWithFlag(data []byte, from netip.AddrPort, lConn *net.UDPConn, to netip.AddrPort, lanWanFlag consts.LanWanFlag) error {
|
||||||
hdr := AddrHdr{
|
hdr := AddrHdr{
|
||||||
Dest: from,
|
Dest: from,
|
||||||
Outbound: lanWanFlag, // Pass some message to the kernel program.
|
Outbound: uint8(lanWanFlag), // Pass some message to the kernel program.
|
||||||
}
|
}
|
||||||
bHdr := hdr.ToBytesFromPool()
|
bHdr := hdr.ToBytesFromPool()
|
||||||
defer pool.Put(bHdr)
|
defer pool.Put(bHdr)
|
||||||
@ -89,7 +89,7 @@ func sendPktWithHdrWithFlag(data []byte, from netip.AddrPort, lConn *net.UDPConn
|
|||||||
}
|
}
|
||||||
|
|
||||||
// sendPkt uses bind first, and fallback to send hdr if addr is in use.
|
// sendPkt uses bind first, and fallback to send hdr if addr is in use.
|
||||||
func sendPkt(data []byte, from netip.AddrPort, realTo, to netip.AddrPort, lConn *net.UDPConn, lanWanFlag uint8) (err error) {
|
func sendPkt(data []byte, from netip.AddrPort, realTo, to netip.AddrPort, lConn *net.UDPConn, lanWanFlag consts.LanWanFlag) (err error) {
|
||||||
d := net.Dialer{Control: func(network, address string, c syscall.RawConn) error {
|
d := net.Dialer{Control: func(network, address string, c syscall.RawConn) error {
|
||||||
return dialer.BindControl(c, from)
|
return dialer.BindControl(c, from)
|
||||||
}}
|
}}
|
||||||
@ -108,7 +108,7 @@ func sendPkt(data []byte, from netip.AddrPort, realTo, to netip.AddrPort, lConn
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *ControlPlane) WriteToUDP(lanWanFlag uint8, lConn *net.UDPConn, realTo, to netip.AddrPort, isDNS bool, dummyFrom *netip.AddrPort, validateRushAnsFunc func(from netip.AddrPort) bool) UdpHandler {
|
func (c *ControlPlane) WriteToUDP(lanWanFlag consts.LanWanFlag, lConn *net.UDPConn, realTo, to netip.AddrPort, isDNS bool, dummyFrom *netip.AddrPort, validateRushAnsFunc func(from netip.AddrPort) bool) UdpHandler {
|
||||||
return func(data []byte, from netip.AddrPort) (err error) {
|
return func(data []byte, from netip.AddrPort) (err error) {
|
||||||
// Do not return conn-unrelated err in this func.
|
// Do not return conn-unrelated err in this func.
|
||||||
|
|
||||||
@ -137,14 +137,14 @@ func (c *ControlPlane) WriteToUDP(lanWanFlag uint8, lConn *net.UDPConn, realTo,
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *ControlPlane) handlePkt(lConn *net.UDPConn, data []byte, src, pktDst, realDst netip.AddrPort, outboundIndex consts.OutboundIndex) (err error) {
|
func (c *ControlPlane) handlePkt(lConn *net.UDPConn, data []byte, src, pktDst, realDst netip.AddrPort, outboundIndex consts.OutboundIndex) (err error) {
|
||||||
var lanWanFlag uint8
|
var lanWanFlag consts.LanWanFlag
|
||||||
var realSrc netip.AddrPort
|
var realSrc netip.AddrPort
|
||||||
useAssign := pktDst == realDst // Use sk_assign instead of modify target ip/port.
|
useAssign := pktDst == realDst // Use sk_assign instead of modify target ip/port.
|
||||||
if useAssign {
|
if useAssign {
|
||||||
lanWanFlag = consts.IsLan
|
lanWanFlag = consts.LanWanFlag_IsLan
|
||||||
realSrc = src
|
realSrc = src
|
||||||
} else {
|
} else {
|
||||||
lanWanFlag = consts.IsWan
|
lanWanFlag = consts.LanWanFlag_IsWan
|
||||||
// From localhost, so dst IP is src IP.
|
// From localhost, so dst IP is src IP.
|
||||||
realSrc = netip.AddrPortFrom(pktDst.Addr(), src.Port())
|
realSrc = netip.AddrPortFrom(pktDst.Addr(), src.Port())
|
||||||
}
|
}
|
||||||
@ -181,7 +181,7 @@ func (c *ControlPlane) handlePkt(lConn *net.UDPConn, data []byte, src, pktDst, r
|
|||||||
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.Tracef("UDP(DNS) %v <-[%v]-> Cache: %v %v",
|
c.log.Tracef("UDP(DNS) %v <-[%v]-> Cache: %v %v",
|
||||||
RefineSourceToShow(src, realDst.Addr()), outbound.Name, strings.ToLower(q.Name.String()), q.Type,
|
RefineSourceToShow(realSrc, realDst.Addr(), lanWanFlag), outbound.Name, strings.ToLower(q.Name.String()), q.Type,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@ -225,7 +225,7 @@ func (c *ControlPlane) handlePkt(lConn *net.UDPConn, data []byte, src, pktDst, r
|
|||||||
c.log.WithFields(logrus.Fields{
|
c.log.WithFields(logrus.Fields{
|
||||||
"ipversions": ipversions,
|
"ipversions": ipversions,
|
||||||
"l4protos": l4protos,
|
"l4protos": l4protos,
|
||||||
"src": src.String(),
|
"src": realSrc.String(),
|
||||||
}).Traceln("Choose DNS path")
|
}).Traceln("Choose DNS path")
|
||||||
// Get the min latency path.
|
// Get the min latency path.
|
||||||
networkType := dialer.NetworkType{
|
networkType := dialer.NetworkType{
|
||||||
@ -300,7 +300,7 @@ func (c *ControlPlane) handlePkt(lConn *net.UDPConn, data []byte, src, pktDst, r
|
|||||||
if retry > MaxRetry {
|
if retry > MaxRetry {
|
||||||
return fmt.Errorf("touch max retry limit")
|
return fmt.Errorf("touch max retry limit")
|
||||||
}
|
}
|
||||||
ue, isNew, err = DefaultUdpEndpointPool.GetOrCreate(src, &UdpEndpointOptions{
|
ue, isNew, err = DefaultUdpEndpointPool.GetOrCreate(realSrc, &UdpEndpointOptions{
|
||||||
Handler: udpHandler,
|
Handler: udpHandler,
|
||||||
NatTimeout: natTimeout,
|
NatTimeout: natTimeout,
|
||||||
DialerFunc: func() (*dialer.Dialer, error) {
|
DialerFunc: func() (*dialer.Dialer, error) {
|
||||||
@ -314,12 +314,12 @@ func (c *ControlPlane) handlePkt(lConn *net.UDPConn, data []byte, src, pktDst, r
|
|||||||
// If the udp endpoint has been not alive, remove it from pool and get a new one.
|
// If the udp endpoint has been not alive, remove it from pool and get a new one.
|
||||||
if !isNew && !ue.Dialer.MustGetAlive(networkType) {
|
if !isNew && !ue.Dialer.MustGetAlive(networkType) {
|
||||||
c.log.WithFields(logrus.Fields{
|
c.log.WithFields(logrus.Fields{
|
||||||
"src": RefineSourceToShow(src, realDst.Addr()),
|
"src": RefineSourceToShow(realSrc, realDst.Addr(), lanWanFlag),
|
||||||
"network": networkType.String(),
|
"network": networkType.String(),
|
||||||
"dialer": ue.Dialer.Name(),
|
"dialer": ue.Dialer.Name(),
|
||||||
"retry": retry,
|
"retry": retry,
|
||||||
}).Debugln("Old udp endpoint was not alive and removed.")
|
}).Debugln("Old udp endpoint was not alive and removed.")
|
||||||
_ = DefaultUdpEndpointPool.Remove(src, ue)
|
_ = DefaultUdpEndpointPool.Remove(realSrc, ue)
|
||||||
retry++
|
retry++
|
||||||
goto getNew
|
goto getNew
|
||||||
}
|
}
|
||||||
@ -336,7 +336,7 @@ func (c *ControlPlane) handlePkt(lConn *net.UDPConn, data []byte, src, pktDst, r
|
|||||||
"err": err.Error(),
|
"err": err.Error(),
|
||||||
"retry": retry,
|
"retry": retry,
|
||||||
}).Debugln("Failed to write UDP packet request. Try to remove old UDP endpoint and retry.")
|
}).Debugln("Failed to write UDP packet request. Try to remove old UDP endpoint and retry.")
|
||||||
_ = DefaultUdpEndpointPool.Remove(src, ue)
|
_ = DefaultUdpEndpointPool.Remove(realSrc, ue)
|
||||||
retry++
|
retry++
|
||||||
goto getNew
|
goto getNew
|
||||||
}
|
}
|
||||||
@ -400,7 +400,7 @@ func (c *ControlPlane) handlePkt(lConn *net.UDPConn, data []byte, src, pktDst, r
|
|||||||
"qname": strings.ToLower(q.Name.String()),
|
"qname": strings.ToLower(q.Name.String()),
|
||||||
"qtype": q.Type,
|
"qtype": q.Type,
|
||||||
}).Infof("%v <-> %v",
|
}).Infof("%v <-> %v",
|
||||||
RefineSourceToShow(src, realDst.Addr()), RefineAddrPortToShow(destToSend),
|
RefineSourceToShow(realSrc, realDst.Addr(), lanWanFlag), RefineAddrPortToShow(destToSend),
|
||||||
)
|
)
|
||||||
} 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.
|
||||||
@ -409,7 +409,7 @@ func (c *ControlPlane) handlePkt(lConn *net.UDPConn, data []byte, src, pktDst, r
|
|||||||
"outbound": outbound.Name,
|
"outbound": outbound.Name,
|
||||||
"dialer": realDialer.Name(),
|
"dialer": realDialer.Name(),
|
||||||
}).Infof("%v <-> %v",
|
}).Infof("%v <-> %v",
|
||||||
RefineSourceToShow(src, realDst.Addr()), RefineAddrPortToShow(destToSend),
|
RefineSourceToShow(realSrc, realDst.Addr(), lanWanFlag), RefineAddrPortToShow(destToSend),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user