mirror of
https://github.com/SagerNet/sing-box.git
synced 2026-04-11 17:47:20 +10:00
50 lines
1.2 KiB
Go
50 lines
1.2 KiB
Go
package route
|
|
|
|
import (
|
|
"context"
|
|
"net/netip"
|
|
"syscall"
|
|
|
|
"github.com/sagernet/sing-box/adapter"
|
|
"github.com/sagernet/sing-box/common/process"
|
|
N "github.com/sagernet/sing/common/network"
|
|
)
|
|
|
|
type platformSearcher struct {
|
|
platform adapter.PlatformInterface
|
|
}
|
|
|
|
func newPlatformSearcher(platform adapter.PlatformInterface) process.Searcher {
|
|
return &platformSearcher{platform: platform}
|
|
}
|
|
|
|
func (s *platformSearcher) FindProcessInfo(ctx context.Context, network string, source netip.AddrPort, destination netip.AddrPort) (*adapter.ConnectionOwner, error) {
|
|
if !s.platform.UsePlatformConnectionOwnerFinder() {
|
|
return nil, process.ErrNotFound
|
|
}
|
|
|
|
var ipProtocol int32
|
|
switch N.NetworkName(network) {
|
|
case N.NetworkTCP:
|
|
ipProtocol = syscall.IPPROTO_TCP
|
|
case N.NetworkUDP:
|
|
ipProtocol = syscall.IPPROTO_UDP
|
|
default:
|
|
return nil, process.ErrNotFound
|
|
}
|
|
|
|
request := &adapter.FindConnectionOwnerRequest{
|
|
IpProtocol: ipProtocol,
|
|
SourceAddress: source.Addr().String(),
|
|
SourcePort: int32(source.Port()),
|
|
DestinationAddress: destination.Addr().String(),
|
|
DestinationPort: int32(destination.Port()),
|
|
}
|
|
|
|
return s.platform.FindConnectionOwner(request)
|
|
}
|
|
|
|
func (s *platformSearcher) Close() error {
|
|
return nil
|
|
}
|