Files
sing-box-extended-mirror/common/srs/ip_cidr.go
T

45 lines
957 B
Go
Raw Normal View History

2025-08-14 10:55:18 +08:00
package srs
import (
"encoding/binary"
2026-01-28 18:22:28 +08:00
"io"
2025-08-14 10:55:18 +08:00
"net/netip"
M "github.com/sagernet/sing/common/metadata"
"github.com/sagernet/sing/common/varbin"
)
func readPrefix(reader varbin.Reader) (netip.Prefix, error) {
2026-01-28 18:22:28 +08:00
addrLen, err := binary.ReadUvarint(reader)
2025-08-14 10:55:18 +08:00
if err != nil {
return netip.Prefix{}, err
}
2026-01-28 18:22:28 +08:00
addrSlice := make([]byte, addrLen)
_, err = io.ReadFull(reader, addrSlice)
if err != nil {
return netip.Prefix{}, err
}
prefixBits, err := reader.ReadByte()
2025-08-14 10:55:18 +08:00
if err != nil {
return netip.Prefix{}, err
}
return netip.PrefixFrom(M.AddrFromIP(addrSlice), int(prefixBits)), nil
}
func writePrefix(writer varbin.Writer, prefix netip.Prefix) error {
2026-01-28 18:22:28 +08:00
addrSlice := prefix.Addr().AsSlice()
_, err := varbin.WriteUvarint(writer, uint64(len(addrSlice)))
if err != nil {
return err
}
_, err = writer.Write(addrSlice)
2025-08-14 10:55:18 +08:00
if err != nil {
return err
}
2026-01-28 18:22:28 +08:00
err = writer.WriteByte(uint8(prefix.Bits()))
2025-08-14 10:55:18 +08:00
if err != nil {
return err
}
return nil
}