{"record":{"id":"25262c3901b918c8","repo":"XTLS/Xray-core","slug":"maxstreamreceivewindow-must-be-at-least-16384","errorCode":null,"errorMessage":"MaxStreamReceiveWindow must be at least 16384","messagePattern":"MaxStreamReceiveWindow must be at least 16384","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"infra/conf/transport_internet.go","lineNumber":264,"sourceCode":"\t\t\tswitch c.FinalMask.QuicParams.Congestion {\n\t\t\tcase \"\", \"brutal\", \"reno\", \"bbr\":\n\t\t\tcase \"force-brutal\":\n\t\t\t\tif up == 0 {\n\t\t\t\t\treturn nil, errors.New(\"force-brutal requires up\")\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn nil, errors.New(\"unknown congestion control: \", c.FinalMask.QuicParams.Congestion, \", valid values: reno, bbr, brutal, force-brutal\")\n\t\t\t}\n\n\t\t\tif (c.FinalMask.QuicParams.UdpHop.Interval.From != 0 && c.FinalMask.QuicParams.UdpHop.Interval.From < 5) || (c.FinalMask.QuicParams.UdpHop.Interval.To != 0 && c.FinalMask.QuicParams.UdpHop.Interval.To < 5) {\n\t\t\t\treturn nil, errors.New(\"Interval must be at least 5\")\n\t\t\t}\n\n\t\t\tif c.FinalMask.QuicParams.InitStreamReceiveWindow > 0 && c.FinalMask.QuicParams.InitStreamReceiveWindow < 16384 {\n\t\t\t\treturn nil, errors.New(\"InitStreamReceiveWindow must be at least 16384\")\n\t\t\t}\n\t\t\tif c.FinalMask.QuicParams.MaxStreamReceiveWindow > 0 && c.FinalMask.QuicParams.MaxStreamReceiveWindow < 16384 {\n\t\t\t\treturn nil, errors.New(\"MaxStreamReceiveWindow must be at least 16384\")\n\t\t\t}\n\t\t\tif c.FinalMask.QuicParams.InitConnectionReceiveWindow > 0 && c.FinalMask.QuicParams.InitConnectionReceiveWindow < 16384 {\n\t\t\t\treturn nil, errors.New(\"InitConnectionReceiveWindow must be at least 16384\")\n\t\t\t}\n\t\t\tif c.FinalMask.QuicParams.MaxConnectionReceiveWindow > 0 && c.FinalMask.QuicParams.MaxConnectionReceiveWindow < 16384 {\n\t\t\t\treturn nil, errors.New(\"MaxConnectionReceiveWindow must be at least 16384\")\n\t\t\t}\n\t\t\tif c.FinalMask.QuicParams.MaxIdleTimeout != 0 && (c.FinalMask.QuicParams.MaxIdleTimeout < 4 || c.FinalMask.QuicParams.MaxIdleTimeout > 120) {\n\t\t\t\treturn nil, errors.New(\"MaxIdleTimeout must be between 4 and 120\")\n\t\t\t}\n\t\t\tif c.FinalMask.QuicParams.KeepAlivePeriod != 0 && (c.FinalMask.QuicParams.KeepAlivePeriod < 2 || c.FinalMask.QuicParams.KeepAlivePeriod > 60) {\n\t\t\t\treturn nil, errors.New(\"KeepAlivePeriod must be between 2 and 60\")\n\t\t\t}\n\t\t\tif c.FinalMask.QuicParams.MaxIncomingStreams != 0 && c.FinalMask.QuicParams.MaxIncomingStreams < 8 {\n\t\t\t\treturn nil, errors.New(\"MaxIncomingStreams must be at least 8\")\n\t\t\t}\n\n\t\t\tif c.FinalMask.QuicParams.Debug {","sourceCodeStart":246,"sourceCodeEnd":282,"githubUrl":"https://github.com/XTLS/Xray-core/blob/7d214f8b094f75322fa3990f8aadad1c912f24f5/infra/conf/transport_internet.go#L246-L282","documentation":"Same 16384-byte floor applied to finalMask.quicParams.maxStreamReceiveWindow. A positive value below 16 KiB is invalid because a max stream window smaller than the protocol minimum is contradictory; 0 means unset/default.","triggerScenarios":"\"quicParams\": { \"maxStreamReceiveWindow\": 4096 }.","commonSituations":"Setting max below init (or below the floor) when trimming buffers; pasting partial numbers; misreading the unit as KiB.","solutions":["Set maxStreamReceiveWindow >= 16384 bytes (and >= initStreamReceiveWindow).","Or leave it unset for the default.","Use explicit byte values from the reference configs (e.g. 8388608)."],"exampleFix":"// before\n\"quicParams\": { \"maxStreamReceiveWindow\": 4096 }\n// after\n\"quicParams\": { \"maxStreamReceiveWindow\": 8388608 }","handlingStrategy":"validation","validationCode":"func streamWindowsOK(qp map[string]any) bool {\n    return windowFloorOK(qp[\"maxStreamReceiveWindow\"], 16384) &&\n        windowFloorOK(qp[\"initStreamReceiveWindow\"], 16384)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Validate init <= max for stream windows in addition to the floor.","Copy window sets from a known-good config rather than inventing numbers.","Lint all four window fields together since they share the same floor."],"tags":["go","xray","config","quic","flow-control","validation"],"backgroundTag":null,"analyzedSha":"7d214f8b094f75322fa3990f8aadad1c912f24f5","analyzedAt":"2026-08-15T14:26:24.325Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}