XTLS/Xray-core · error
PacketsFrom can't be 0
Error message
PacketsFrom can't be 0
What it means
Thrown when the freedom outbound's fragment packets range parses successfully but its lower bound is 0. A zero starting packet is meaningless for TCP segmentation (packet numbering starts at 1), so Build() rejects PacketsFrom == 0 after converting the parsed range. Only reachable on the numeric-range branch, not for "tlshello" or "".
Source
Thrown at infra/conf/freedom.go:114
switch strings.ToLower(c.Fragment.Packets) {
case "tlshello":
// TLS Hello Fragmentation (into multiple handshake messages)
config.Fragment.PacketsFrom = 0
config.Fragment.PacketsTo = 1
case "":
// TCP Segmentation (all packets)
config.Fragment.PacketsFrom = 0
config.Fragment.PacketsTo = 0
default:
// TCP Segmentation (range)
from, to, err := ParseRangeString(c.Fragment.Packets)
if err != nil {
return nil, errors.New("Invalid PacketsFrom").Base(err)
}
config.Fragment.PacketsFrom = uint64(from)
config.Fragment.PacketsTo = uint64(to)
if config.Fragment.PacketsFrom == 0 {
return nil, errors.New("PacketsFrom can't be 0")
}
}
{
if c.Fragment.Length == nil {
return nil, errors.New("Length can't be empty")
}
config.Fragment.LengthMin = uint64(c.Fragment.Length.From)
config.Fragment.LengthMax = uint64(c.Fragment.Length.To)
if config.Fragment.LengthMin == 0 {
return nil, errors.New("LengthMin can't be 0")
}
}
{
if c.Fragment.Interval == nil {
return nil, errors.New("Interval can't be empty")
}View on GitHub (pinned to 7d214f8b09)
Solutions
- Start the range at 1: use "1-5" instead of "0-5".
- To fragment all packets, omit "packets" or set it to "" rather than "0-0".
- For TLS ClientHello splitting use "tlshello".
Example fix
// before "packets": "0-3" // after "packets": "1-3"
Defensive patterns
Strategy: validation
Validate before calling
if from, _, err := ParseRangeString(fragment.Packets); err == nil && from < 1 {
return errors.New("fragment.packets range must start at 1")
} Prevention
- Treat packet numbering as 1-based.
- Use "" (all packets) instead of "0-0".
When it happens
Trigger: "fragment": {"packets": "0-5"} or "0-0" — any range whose from value is 0. ParseRangeString succeeds, then the explicit zero check fires.
Common situations: Assuming packet indices are zero-based; auto-generated ranges starting at 0.
Related errors
- LengthMin can't be 0
- Invalid PacketsFrom
- Length can't be empty
- Interval can't be empty
- rand lengthMin or lengthMax cannot be 0
AI-assisted analysis of XTLS/Xray-core@7d214f8b09 (2026-08-15).
Data as JSON: /api/errors/144bea39e7f1a767.
Report an issue: GitHub.