Compare commits

..
Author SHA1 Message Date
Fangliding 59b0255d83 Treat int as int32 2026-10-15 00:53:10 +08:00
11 changed files with 35 additions and 73 deletions
+1 -1
View File
@@ -109,7 +109,7 @@ func (h *HealthPingRTTS) getStatistics() *HealthPingStats {
stats.Min = 0 stats.Min = 0
return stats return stats
} }
stats.Average = time.Duration(int(sum) / cnt) stats.Average = sum / time.Duration(cnt)
var std float64 var std float64
if cnt < 2 { if cnt < 2 {
// no enough data for standard deviation, we assume it's half of the average rtt // no enough data for standard deviation, we assume it's half of the average rtt
+1 -1
View File
@@ -153,7 +153,7 @@ func parsePlainUDPPacket(sessionID, packetID uint64, bodyPlain []byte) (DecodedU
return DecodedUDPPacket{}, ErrBadHeaderType return DecodedUDPPacket{}, ErrBadHeaderType
} }
epoch := binary.BigEndian.Uint64(bodyPlain[1:9]) epoch := binary.BigEndian.Uint64(bodyPlain[1:9])
diff := int(math.Abs(float64(time.Now().Unix() - int64(epoch)))) diff := math.Abs(float64(time.Now().Unix() - int64(epoch)))
if diff > 30 { if diff > 30 {
return DecodedUDPPacket{}, ErrBadTimestamp return DecodedUDPPacket{}, ErrBadTimestamp
} }
+2 -2
View File
@@ -49,12 +49,12 @@ func (f *SlidingWindow) Add(counter uint64) {
if counter > f.last { if counter > f.last {
lastBlockIndex := f.last >> swBlockBitLog lastBlockIndex := f.last >> swBlockBitLog
diff := int(blockIndex - lastBlockIndex) diff := blockIndex - lastBlockIndex
if diff > swRingBlocks { if diff > swRingBlocks {
diff = swRingBlocks diff = swRingBlocks
} }
for i := 0; i < diff; i++ { for i := 0; i < int(diff); i++ {
lastBlockIndex = (lastBlockIndex + 1) & swBlockMask lastBlockIndex = (lastBlockIndex + 1) & swBlockMask
f.ring[lastBlockIndex] = 0 f.ring[lastBlockIndex] = 0
} }
+2 -2
View File
@@ -253,7 +253,7 @@ func ReadClientRequestHeaderWithFixed(reader *StreamReader, fixedChunk []byte) (
} }
epoch := binary.BigEndian.Uint64(plainFixed[1:9]) epoch := binary.BigEndian.Uint64(plainFixed[1:9])
diff := int(math.Abs(float64(time.Now().Unix() - int64(epoch)))) diff := math.Abs(float64(time.Now().Unix() - int64(epoch)))
if diff > 30 { if diff > 30 {
return nil, ErrBadTimestamp return nil, ErrBadTimestamp
} }
@@ -430,7 +430,7 @@ func ReadTCPResponse(r io.Reader, method *CipherMethod, psk []byte, clientSalt [
} }
serverEpoch := binary.BigEndian.Uint64(decryptedFixed[1:9]) serverEpoch := binary.BigEndian.Uint64(decryptedFixed[1:9])
diff := int(math.Abs(float64(time.Now().Unix() - int64(serverEpoch)))) diff := math.Abs(float64(time.Now().Unix() - int64(serverEpoch)))
if diff > 30 { if diff > 30 {
return nil, ErrBadTimestamp return nil, ErrBadTimestamp
} }
+2 -7
View File
@@ -125,8 +125,7 @@ func (t *Handler) Start() error {
errors.LogInfo(context.Background(), "[tun] falied to set interface > iface == nil") errors.LogInfo(context.Background(), "[tun] falied to set interface > iface == nil")
return errors.New("iface not found") return errors.New("iface not found")
} }
var controlErr, sockErr error return c.Control(func(fd uintptr) {
controlErr = c.Control(func(fd uintptr) {
addrPort, _ := netip.ParseAddrPort(address) addrPort, _ := netip.ParseAddrPort(address)
// skip loopback // skip loopback
if addrPort.Addr().IsLoopback() || strings.HasPrefix(strings.ToLower(address), "localhost:") { if addrPort.Addr().IsLoopback() || strings.HasPrefix(strings.ToLower(address), "localhost:") {
@@ -134,13 +133,9 @@ func (t *Handler) Start() error {
} }
err := setinterface(network, address, fd, iface) err := setinterface(network, address, fd, iface)
if err != nil { if err != nil {
sockErr = errors.New("[tun] falied to set interface").Base(err) errors.LogInfoInner(context.Background(), err, "[tun] falied to set interface")
} }
}) })
if sockErr != nil {
return sockErr
}
return controlErr
}) })
} }
-19
View File
@@ -28,22 +28,3 @@ func (v *SocketConfig) ParseTFOValue() int {
} }
return tfo return tfo
} }
// Dial should fail on bind errors, return this to indicate such errors.
type BindError struct {
err error
}
func (e *BindError) Unwrap() error {
return e.err
}
func (e *BindError) Error() string {
return "failed to bind to interface: " + e.err.Error()
}
func NewBindError(err error) *BindError {
return &BindError{
err: err,
}
}
+3 -3
View File
@@ -136,15 +136,15 @@ func applyOutboundSocketOptions(network string, address string, fd uintptr, conf
if config.Interface != "" { if config.Interface != "" {
iface, err := net.InterfaceByName(config.Interface) iface, err := net.InterfaceByName(config.Interface)
if err != nil { if err != nil {
return NewBindError(errors.New("failed to get interface ", config.Interface).Base(err)) return errors.New("failed to get interface ", config.Interface).Base(err)
} }
if network == "tcp6" || network == "udp6" { if network == "tcp6" || network == "udp6" {
if err := unix.SetsockoptInt(int(fd), unix.IPPROTO_IPV6, unix.IPV6_BOUND_IF, iface.Index); err != nil { if err := unix.SetsockoptInt(int(fd), unix.IPPROTO_IPV6, unix.IPV6_BOUND_IF, iface.Index); err != nil {
return NewBindError(errors.New("failed to set IPV6_BOUND_IF").Base(err)) return errors.New("failed to set IPV6_BOUND_IF").Base(err)
} }
} else { } else {
if err := unix.SetsockoptInt(int(fd), unix.IPPROTO_IP, unix.IP_BOUND_IF, iface.Index); err != nil { if err := unix.SetsockoptInt(int(fd), unix.IPPROTO_IP, unix.IP_BOUND_IF, iface.Index); err != nil {
return NewBindError(errors.New("failed to set IP_BOUND_IF").Base(err)) return errors.New("failed to set IP_BOUND_IF").Base(err)
} }
} }
} }
+1 -1
View File
@@ -22,7 +22,7 @@ func applyOutboundSocketOptions(network string, address string, fd uintptr, conf
if config.Interface != "" { if config.Interface != "" {
if err := syscall.BindToDevice(int(fd), config.Interface); err != nil { if err := syscall.BindToDevice(int(fd), config.Interface); err != nil {
return NewBindError(errors.New("failed to set Interface").Base(err)) return errors.New("failed to set Interface").Base(err)
} }
} }
+5 -5
View File
@@ -35,7 +35,7 @@ func applyOutboundSocketOptions(network string, address string, fd uintptr, conf
if config.Interface != "" { if config.Interface != "" {
inf, err := net.InterfaceByName(config.Interface) inf, err := net.InterfaceByName(config.Interface)
if err != nil { if err != nil {
return NewBindError(errors.New("failed to find the interface").Base(err)) return errors.New("failed to find the interface").Base(err)
} }
// easy way to check if the address is ipv4 // easy way to check if the address is ipv4
isV4 := strings.Contains(address, ".") isV4 := strings.Contains(address, ".")
@@ -47,20 +47,20 @@ func applyOutboundSocketOptions(network string, address string, fd uintptr, conf
binary.BigEndian.PutUint32(bytes[:], uint32(inf.Index)) binary.BigEndian.PutUint32(bytes[:], uint32(inf.Index))
idx := *(*uint32)(unsafe.Pointer(&bytes[0])) idx := *(*uint32)(unsafe.Pointer(&bytes[0]))
if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.IPPROTO_IP, IP_UNICAST_IF, int(idx)); err != nil { if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.IPPROTO_IP, IP_UNICAST_IF, int(idx)); err != nil {
return NewBindError(errors.New("failed to set IP_UNICAST_IF").Base(err)) return errors.New("failed to set IP_UNICAST_IF").Base(err)
} }
if ip := net.ParseIP(host); ip != nil && ip.IsMulticast() && isUDPSocket(network) { if ip := net.ParseIP(host); ip != nil && ip.IsMulticast() && isUDPSocket(network) {
if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF, int(idx)); err != nil { if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF, int(idx)); err != nil {
return NewBindError(errors.New("failed to set IP_MULTICAST_IF").Base(err)) return errors.New("failed to set IP_MULTICAST_IF").Base(err)
} }
} }
} else { } else {
if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.IPPROTO_IPV6, IPV6_UNICAST_IF, inf.Index); err != nil { if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.IPPROTO_IPV6, IPV6_UNICAST_IF, inf.Index); err != nil {
return NewBindError(errors.New("failed to set IPV6_UNICAST_IF").Base(err)) return errors.New("failed to set IPV6_UNICAST_IF").Base(err)
} }
if ip := net.ParseIP(host); ip != nil && ip.IsMulticast() && isUDPSocket(network) { if ip := net.ParseIP(host); ip != nil && ip.IsMulticast() && isUDPSocket(network) {
if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.IPPROTO_IPV6, syscall.IPV6_MULTICAST_IF, inf.Index); err != nil { if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.IPPROTO_IPV6, syscall.IPV6_MULTICAST_IF, inf.Index); err != nil {
return NewBindError(errors.New("failed to set IPV6_MULTICAST_IF").Base(err)) return errors.New("failed to set IPV6_MULTICAST_IF").Base(err)
} }
} }
} }
+17 -31
View File
@@ -68,27 +68,19 @@ func (d *DefaultSystemDialer) Dial(ctx context.Context, src net.Address, dest ne
} }
} }
var lc net.ListenConfig var lc net.ListenConfig
if sockopt != nil || len(Controllers) > 0 { lc.Control = func(network, address string, c syscall.RawConn) error {
lc.Control = func(network, address string, c syscall.RawConn) error { for _, ctl := range Controllers {
for _, ctl := range Controllers { if err := ctl(network, address, c); err != nil {
if err := ctl(network, address, c); err != nil { errors.LogInfoInner(ctx, err, "failed to apply external controller")
return errors.New("failed to apply external controller").Base(err)
}
} }
if sockopt != nil {
var sockErr, controlErr error
controlErr = c.Control(func(fd uintptr) {
if sockErr = applyOutboundSocketOptions(network, destAddr.String(), fd, sockopt); sockErr != nil {
errors.LogInfoInner(ctx, sockErr, "failed to apply socket options")
}
})
if _, ok := sockErr.(*BindError); ok {
return sockErr
}
return controlErr
}
return nil
} }
return c.Control(func(fd uintptr) {
if sockopt != nil {
if err := applyOutboundSocketOptions(network, destAddr.String(), fd, sockopt); err != nil {
errors.LogInfo(ctx, err, "failed to apply socket options")
}
}
})
} }
packetConn, err := lc.ListenPacket(ctx, srcAddr.Network(), srcAddr.String()) packetConn, err := lc.ListenPacket(ctx, srcAddr.Network(), srcAddr.String())
if err != nil { if err != nil {
@@ -136,22 +128,16 @@ func (d *DefaultSystemDialer) Dial(ctx context.Context, src net.Address, dest ne
dialer.Control = func(network, address string, c syscall.RawConn) error { dialer.Control = func(network, address string, c syscall.RawConn) error {
for _, ctl := range Controllers { for _, ctl := range Controllers {
if err := ctl(network, address, c); err != nil { if err := ctl(network, address, c); err != nil {
return errors.New("failed to apply external controller").Base(err) errors.LogInfoInner(ctx, err, "failed to apply external controller")
} }
} }
if sockopt != nil { return c.Control(func(fd uintptr) {
var sockErr, controlErr error if sockopt != nil {
controlErr = c.Control(func(fd uintptr) { if err := applyOutboundSocketOptions(network, address, fd, sockopt); err != nil {
if sockErr = applyOutboundSocketOptions(network, address, fd, sockopt); sockErr != nil { errors.LogInfoInner(ctx, err, "failed to apply socket options")
errors.LogInfoInner(ctx, sockErr, "failed to apply socket options")
} }
})
if _, ok := sockErr.(*BindError); ok {
return sockErr
} }
return controlErr })
}
return nil
} }
} }
+1 -1
View File
@@ -153,7 +153,7 @@ func jitter(backoff time.Duration) time.Duration {
if half <= 0 { if half <= 0 {
return backoff return backoff
} }
return half + time.Duration(dice.Roll(int(half))) return half + time.Duration(dice.RollInt63n(int64(half)))
} }
func rateLimited(payload []byte) bool { func rateLimited(payload []byte) bool {