| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- // Package net is a drop-in replacement to Golang's net package, with some more functionalities.
- package net // import "github.com/xtls/xray-core/common/net"
- import (
- "net"
- "sync/atomic"
- "time"
- "github.com/xtls/xray-core/common/errors"
- )
- // defines the maximum time an idle TCP session can survive in the tunnel, so
- // it should be consistent across HTTP versions and with other transports.
- const ConnIdleTimeout = 300 * time.Second
- // consistent with quic-go
- const QuicgoH3KeepAlivePeriod = 10 * time.Second
- // consistent with chrome
- const ChromeH2KeepAlivePeriod = 45 * time.Second
- var ErrNotLocal = errors.New("the source address is not from local machine.")
- type localIPCacheEntry struct {
- addrs []net.Addr
- lastUpdate time.Time
- }
- var localIPCache = atomic.Pointer[localIPCacheEntry]{}
- func IsLocal(ip net.IP) (bool, error) {
- var addrs []net.Addr
- if entry := localIPCache.Load(); entry == nil || time.Since(entry.lastUpdate) > time.Minute {
- var err error
- addrs, err = net.InterfaceAddrs()
- if err != nil {
- return false, err
- }
- localIPCache.Store(&localIPCacheEntry{
- addrs: addrs,
- lastUpdate: time.Now(),
- })
- } else {
- addrs = entry.addrs
- }
- for _, addr := range addrs {
- if ipnet, ok := addr.(*net.IPNet); ok {
- if ipnet.IP.Equal(ip) {
- return true, nil
- }
- }
- }
- return false, nil
- }
|