{"record":{"id":"c91a323d73c1f7e8","repo":"cloudflare/cloudflared","slug":"funnel-not-found","errorCode":null,"errorMessage":"funnel not found","messagePattern":"funnel not found","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"packet/funnel.go","lineNumber":14,"sourceCode":"package packet\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/netip\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n)\n\nvar (\n\tErrFunnelNotFound = errors.New(\"funnel not found\")\n)\n\n// Funnel is an abstraction to pipe from 1 src to 1 or more destinations\ntype Funnel interface {\n\t// Updates the last time traffic went through this funnel\n\tUpdateLastActive()\n\t// LastActive returns the last time there is traffic through this funnel\n\tLastActive() time.Time\n\t// Close closes the funnel. Further call to SendToDst or ReturnToSrc should return an error\n\tClose() error\n\t// Equal compares if 2 funnels are equivalent\n\tEqual(other Funnel) bool\n}\n\n// FunnelUniPipe is a unidirectional pipe for sending raw packets\ntype FunnelUniPipe interface {\n\t// SendPacket sends a packet to/from the funnel. It must not modify the packet,\n\t// and after return it must not read the packet","sourceCodeStart":1,"sourceCodeEnd":32,"githubUrl":"https://github.com/cloudflare/cloudflared/blob/2253eeeb25a44a713a4b60b8ba1e1b3f377d1a0f/packet/funnel.go#L1-L32","documentation":"ErrFunnelNotFound (public) is returned by the packet funnel registry when a lookup by funnel ID fails — no active funnel exists for that key. In ICMP proxying it means the ICMP echo came from a source with no tracked funnel (e.g. an unsolicited or expired reply path).","triggerScenarios":"sendReply-related flow: ip.srcFunnelTracker.Get(funnelID) returns ok=false in ingress/icmp_darwin.go, typically when an ICMP response arrives after the funnel was closed or never registered.","commonSituations":"Stale ICMP echo replies arriving after the originating connection's funnel expired; ICMP traffic from a source that never opened a funnel through the tunnel.","solutions":["Retransmit the original ICMP echo/ping to re-establish the funnel, then expect the reply","Check that the client session that created the funnel is still alive","Ignore the error for unsolicited ICMP replies — it is expected for expired funnels","Increase keepalive/idle settings so long-lived pings do not let the funnel expire"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"funnel, ok := tracker.Get(funnelID)\nif !ok {\n    // expected for expired funnels; drop the packet instead of treating as fatal\n    return packet.ErrFunnelNotFound\n}","preventionTips":["Treat ErrFunnelNotFound as non-fatal for unsolicited ICMP replies","Keep client sessions alive while pings are in flight","Re-ping to recreate the funnel instead of relying on stale reply paths"],"tags":["network","icmp","packet","funnel"],"backgroundTag":"resource-not-found","analyzedSha":"2253eeeb25a44a713a4b60b8ba1e1b3f377d1a0f","analyzedAt":"2026-09-06T04:14:33.757Z","contentChangedAt":"2026-09-06T04:14:33.757Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}