{"record":{"id":"cc0a3f958d2c4a41","repo":"XTLS/Xray-core","slug":"force-brutal-requires-up","errorCode":null,"errorMessage":"force-brutal requires up","messagePattern":"force-brutal requires up","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"infra/conf/transport_internet.go","lineNumber":250,"sourceCode":"\t\t\t}\n\t\t\tdown, err := c.FinalMask.QuicParams.BrutalDown.Bps()\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\tif up > 0 && up < 65536 {\n\t\t\t\treturn nil, errors.New(\"BrutalUp must be at least 65536 bytes per second\")\n\t\t\t}\n\t\t\tif down > 0 && down < 65536 {\n\t\t\t\treturn nil, errors.New(\"BrutalDown must be at least 65536 bytes per second\")\n\t\t\t}\n\n\t\t\tc.FinalMask.QuicParams.Congestion = strings.ToLower(c.FinalMask.QuicParams.Congestion)\n\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}","sourceCodeStart":232,"sourceCodeEnd":268,"githubUrl":"https://github.com/XTLS/Xray-core/blob/7d214f8b094f75322fa3990f8aadad1c912f24f5/infra/conf/transport_internet.go#L232-L268","documentation":"Thrown when congestion is set to \"force-brutal\" but brutalUp is 0/unset. force-brutal means the connection must use Brutal CC with a fixed send rate, so an upstream bandwidth is mandatory. The check runs after the Brutal floor checks and before the QUIC numeric range checks.","triggerScenarios":"\"quicParams\": { \"congestion\": \"force-brutal\" } with no brutalUp field (or brutalUp explicitly 0).","commonSituations":"Setting only brutalDown for a download-heavy server profile; assuming the server infers the up rate; renaming from \"brutal\" to \"force-brutal\" without adding bandwidth.","solutions":["Add a brutalUp value of at least 65536 B/s alongside congestion: \"force-brutal\".","Or use plain \"brutal\" if you do not want to force a fixed upstream rate.","Verify brutalUp parses (e.g. \"10 MBps\"); an unparsable string errors earlier in Bps()."],"exampleFix":"// before\n\"quicParams\": { \"congestion\": \"force-brutal\", \"brutalDown\": \"1 MBps\" }\n// after\n\"quicParams\": { \"congestion\": \"force-brutal\", \"brutalUp\": \"5 MBps\", \"brutalDown\": \"1 MBps\" }","handlingStrategy":"validation","validationCode":"func forceBrutalSatisfied(qp map[string]any) bool {\n    c, _ := qp[\"congestion\"].(string)\n    if strings.ToLower(c) != \"force-brutal\" { return true }\n    up, _ := qp[\"brutalUp\"].(string)\n    bps, err := parseBandwidthToBytesPerSec(up)\n    return err == nil && bps > 0\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat 'force-brutal implies brutalUp' as a pair in config templates.","Prefer 'brutal' unless a fixed upstream rate is explicitly required.","Test-render configs with a validator that knows the congestion rules."],"tags":["go","xray","config","quic","brutal","congestion-control","validation"],"backgroundTag":null,"analyzedSha":"7d214f8b094f75322fa3990f8aadad1c912f24f5","analyzedAt":"2026-08-15T14:26:24.325Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}