func Dial(dest v2net.Destination) (net.Conn, error) { var ip net.IP if dest.Address().IsIPv4() || dest.Address().IsIPv6() { ip = dest.Address().IP() } else { ips, err := net.LookupIP(dest.Address().Domain()) if err != nil { return nil, err } if len(ips) == 0 { return nil, ErrInvalidHost } ip = ips[dice.Roll(len(ips))] } if dest.IsTCP() { return net.DialTCP("tcp", nil, &net.TCPAddr{ IP: ip, Port: int(dest.Port()), }) } else { return net.DialUDP("udp", nil, &net.UDPAddr{ IP: ip, Port: int(dest.Port()), }) } }
func (this *InboundDetourHandlerDynamic) GetConnectionHandler() (proxy.InboundHandler, int) { this.RLock() defer this.RUnlock() ich := this.ichInUse[dice.Roll(len(this.ichInUse))] until := this.config.Allocation.Refresh - int((time.Now().Unix()-this.lastRefresh.Unix())/60/1000) if until < 0 { until = 0 } return ich, int(until) }
func (this *InboundDetourHandlerDynamic) pickUnusedPort() v2net.Port { delta := int(this.config.PortRange.To) - int(this.config.PortRange.From) + 1 for { r := dice.Roll(delta) port := this.config.PortRange.From + v2net.Port(r) _, used := this.portsInUse[port] if !used { return port } } }
// @Private func (this *FreedomConnection) ResolveIP(destination v2net.Destination) v2net.Destination { if !destination.Address().IsDomain() { return destination } ips := this.dns.Get(destination.Address().Domain()) if len(ips) == 0 { log.Info("Freedom: DNS returns nil answer. Keep domain as is.") return destination } ip := ips[dice.Roll(len(ips))] var newDest v2net.Destination if destination.IsTCP() { newDest = v2net.TCPDestination(v2net.IPAddress(ip), destination.Port()) } else { newDest = v2net.UDPDestination(v2net.IPAddress(ip), destination.Port()) } log.Info("Freedom: Changing destination from ", destination, " to ", newDest) return newDest }
func (this *ReceiverManager) pickDetour() *Receiver { if len(this.detours) == 0 { return nil } this.detourAccess.RLock() idx := dice.Roll(len(this.detours)) rec := this.detours[idx] this.detourAccess.RUnlock() if rec.Expired() { this.detourAccess.Lock() detourLen := len(this.detours) if detourLen > idx && this.detours[idx].Expired() { this.detours[idx] = this.detours[detourLen-1] this.detours = this.detours[:detourLen-1] } this.detourAccess.Unlock() return nil } return rec.Receiver }
// @Private func (this *UDPNameServer) AssignUnusedID(response chan<- *ARecord) uint16 { var id uint16 this.Lock() if len(this.requests) > CleanupThreshold && this.nextCleanup.Before(time.Now()) { this.nextCleanup = time.Now().Add(CleanupInterval) go this.Cleanup() } for { id = uint16(dice.Roll(65536)) if _, found := this.requests[id]; found { continue } log.Debug("DNS: Add pending request id ", id) this.requests[id] = &PendingRequest{ expire: time.Now().Add(time.Second * 8), response: response, } break } this.Unlock() return id }
func (this *User) AnyValidID() *ID { if len(this.AlterIDs) == 0 { return this.ID } return this.AlterIDs[dice.Roll(len(this.AlterIDs))] }
func PickPort() v2net.Port { return v2net.Port(30000 + dice.Roll(20000)) }
func (this *InboundDetourHandlerAlways) GetConnectionHandler() (proxy.InboundHandler, int) { ich := this.ich[dice.Roll(len(this.ich))] return ich.handler, this.config.Allocation.Refresh }
package kcp import ( "net" "sync/atomic" "github.com/v2ray/v2ray-core/common/dice" "github.com/v2ray/v2ray-core/common/log" v2net "github.com/v2ray/v2ray-core/common/net" "github.com/v2ray/v2ray-core/transport/internet" ) var ( globalConv = uint32(dice.Roll(65536)) ) func DialKCP(src v2net.Address, dest v2net.Destination) (internet.Connection, error) { udpDest := v2net.UDPDestination(dest.Address(), dest.Port()) log.Info("Dialling KCP to ", udpDest) conn, err := internet.DialToDest(src, udpDest) if err != nil { return nil, err } cpip := NewSimpleAuthenticator() conv := uint16(atomic.AddUint32(&globalConv, 1)) session := NewConnection(conv, conn, conn.LocalAddr().(*net.UDPAddr), conn.RemoteAddr().(*net.UDPAddr), cpip) session.FetchInputFrom(conn) return session, nil }
func (this *VMessAccount) AnyValidID() *ID { if len(this.AlterIDs) == 0 { return this.ID } return this.AlterIDs[dice.Roll(len(this.AlterIDs))] }
func (this *Receiver) PickUser() *proto.User { return this.Accounts[dice.Roll(len(this.Accounts))] }
func (this *ReceiverManager) pickStdReceiver() *Receiver { return this.receivers[dice.Roll(len(this.receivers))] }
func (this *Account) AnyValidID() *protocol.ID { if len(this.AlterIDs) == 0 { return this.ID } return this.AlterIDs[dice.Roll(len(this.AlterIDs))] }
func (this *ServerSpec) PickUser() *User { userCount := len(this.users) return this.users[dice.Roll(userCount)] }
func NewTimestampGenerator(base Timestamp, delta int) TimestampGenerator { return func() Timestamp { rangeInDelta := dice.Roll(delta*2) - delta return base + Timestamp(rangeInDelta) } }