{"record":{"id":"a339cac5f072cb21","repo":"netbirdio/netbird","slug":"invalid-protocol-use-tcp-udp-icmp","errorCode":null,"errorMessage":"invalid protocol: use tcp/udp/icmp","messagePattern":"invalid protocol: use tcp/udp/icmp","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"client/cmd/trace.go","lineNumber":50,"sourceCode":"\ttraceCmd.Flags().Uint8(\"icmp-type\", 0, \"ICMP type\")\n\ttraceCmd.Flags().Uint8(\"icmp-code\", 0, \"ICMP code\")\n\ttraceCmd.Flags().Bool(\"syn\", false, \"TCP SYN flag\")\n\ttraceCmd.Flags().Bool(\"ack\", false, \"TCP ACK flag\")\n\ttraceCmd.Flags().Bool(\"fin\", false, \"TCP FIN flag\")\n\ttraceCmd.Flags().Bool(\"rst\", false, \"TCP RST flag\")\n\ttraceCmd.Flags().Bool(\"psh\", false, \"TCP PSH flag\")\n\ttraceCmd.Flags().Bool(\"urg\", false, \"TCP URG flag\")\n}\n\nfunc tracePacket(cmd *cobra.Command, args []string) error {\n\tdirection := strings.ToLower(args[0])\n\tif direction != \"in\" && direction != \"out\" {\n\t\treturn fmt.Errorf(\"invalid direction: use 'in' or 'out'\")\n\t}\n\n\tprotocol := cmd.Flag(\"protocol\").Value.String()\n\tif protocol != \"tcp\" && protocol != \"udp\" && protocol != \"icmp\" {\n\t\treturn fmt.Errorf(\"invalid protocol: use tcp/udp/icmp\")\n\t}\n\n\tsport, err := cmd.Flags().GetUint16(\"sport\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"invalid source port: %v\", err)\n\t}\n\tdport, err := cmd.Flags().GetUint16(\"dport\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"invalid destination port: %v\", err)\n\t}\n\n\t// For TCP/UDP, generate random ephemeral port (49152-65535) if not specified\n\tif protocol != \"icmp\" {\n\t\tif sport == 0 {\n\t\t\tsport = uint16(rand.Intn(16383) + 49152)\n\t\t}\n\t\tif dport == 0 {\n\t\t\tdport = uint16(rand.Intn(16383) + 49152)","sourceCodeStart":32,"sourceCodeEnd":68,"githubUrl":"https://github.com/netbirdio/netbird/blob/93e97f4bf1ad715072dcb3fb6cdb1763431b5a9c/client/cmd/trace.go#L32-L68","documentation":"Thrown by tracePacket (client/cmd/trace.go:50). The --protocol/-p flag string must be exactly tcp, udp, or icmp (case-sensitive, since the raw flag value is compared); any other value is rejected locally before the daemon RPC. Note flags default to tcp.","triggerScenarios":"Running 'netbird debug trace ... -p TCP' (uppercase fails - the comparison is case-sensitive against cmd.Flag(\"protocol\").Value.String()), or -p gre, -p sctp, or a typo like -p icpm.","commonSituations":"Upper-casing the protocol out of habit; scripts looping over a protocol list that includes protocols the tracer does not model.","solutions":["Use lowercase tcp, udp, or icmp for -p/--protocol","Omit the flag entirely when tcp is intended (it is the default)"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"var validProto = map[string]bool{\"tcp\": true, \"udp\": true, \"icmp\": true}\nif !validProto[proto] {\n    log.Fatalf(\"protocol must be tcp, udp, or icmp (lowercase), got %q\", proto)\n}","typeGuard":"func isTraceProtocol(s string) bool { return s == \"tcp\" || s == \"udp\" || s == \"icmp\" }","tryCatchPattern":null,"preventionTips":["Use lowercase protocol names; the comparison is case-sensitive","Remember tcp is the default when -p is omitted"],"tags":["cli","validation","trace","user-input","netbird"],"backgroundTag":null,"analyzedSha":"93e97f4bf1ad715072dcb3fb6cdb1763431b5a9c","analyzedAt":"2026-08-16T03:09:19.136Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}