pub enum FunnelError {
NotAllowed,
PortNotAllowed(u16),
Cert(CertError),
Unsupported {
detail: String,
},
}Expand description
Why a Funnel listen request was denied or could not be served.
Fail-closed by construction: the access-gate variants (FunnelError::NotAllowed,
FunnelError::PortNotAllowed) deny before any listener is built, and the terminal
FunnelError::Cert carries the same fail-closed CertError as listen_tls (no
self-signed/plaintext fallback). FunnelError::Unsupported marks the public-relay leg that
this fork cannot stand up against its control plane.
Variants§
NotAllowed
The node is not permitted to funnel: it lacks the https and/or funnel node attributes
(Go ipn.NodeCanFunnel). The tailnet admin must enable HTTPS and grant the funnel
attribute via the ACL policy.
PortNotAllowed(u16)
The node may funnel, but port is not in the set granted by the funnel-ports capability
(Go ipn.CheckFunnelPort).
Cert(CertError)
Certificate acquisition / TLS material assembly failed. Funnel terminates public TLS with the
node’s *.ts.net cert (the Funnel hostname is the node’s MagicDNS name, so the existing
DNS-01 cert matches — no TLS-ALPN-01 needed). Without the acme feature (or before a cert is
issued) this carries the same fail-closed CertError as listen_tls — no self-signed or
plaintext fallback.
Unsupported
The public ingress relay leg is unavailable. Funnel ingress arrives as a tailnet-peer POST to
this node’s peerAPI /v0/ingress (the relay is a Tailscale-operated peer that the control
plane stands up); against a self-hosted control plane no such relay exists, so no
public traffic is ever delivered. This is not returned by listen_funnel anymore (the
listener is built and works against real SaaS); it remains for callers that want to surface
the relay gap explicitly. detail names what is missing.
Trait Implementations§
Source§impl Debug for FunnelError
impl Debug for FunnelError
Source§impl Display for FunnelError
impl Display for FunnelError
Source§impl Error for FunnelError
impl Error for FunnelError
Source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · Source§fn description(&self) -> &str
fn description(&self) -> &str
use the Display impl or to_string()