diff options
| author | bitflash-maintainer <noreply@bitflash.invalid> | 2026-09-02 09:03:01 +0000 |
|---|---|---|
| committer | bitflash-maintainer <noreply@bitflash.invalid> | 2026-09-02 09:03:01 +0000 |
| commit | 7c70eb4498e88725241493033edfe89554ff1b18 (patch) | |
| tree | a053678bf029d17c3a0b193fbaaf1abaf3778aff /src/btftunnel.cpp | |
| parent | e4f898c4a6b9900553c64b9804889b5fdae3e55f (diff) | |
tunnel: report which stage failed instead of guessing the cause
Diffstat (limited to 'src/btftunnel.cpp')
| -rw-r--r-- | src/btftunnel.cpp | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/src/btftunnel.cpp b/src/btftunnel.cpp index 63d178b..408476e 100644 --- a/src/btftunnel.cpp +++ b/src/btftunnel.cpp | |||
| @@ -136,18 +136,47 @@ static btf_socket_t StartTunnel(RvSocket rv, const unsigned char shared[32]) | |||
| 136 | return appEnd; | 136 | return appEnd; |
| 137 | } | 137 | } |
| 138 | 138 | ||
| 139 | const char* TunnelFailText(TunnelFail f) | ||
| 140 | { | ||
| 141 | switch (f) | ||
| 142 | { | ||
| 143 | case TUNNEL_FAIL_NONE: return "no failure"; | ||
| 144 | case TUNNEL_FAIL_INIT: return "local socket/crypto init failed"; | ||
| 145 | case TUNNEL_FAIL_DIAL: return "meeting node unreachable (tcp dial failed)"; | ||
| 146 | case TUNNEL_FAIL_REFUSED: return "relay reachable, but no service registered there for this address"; | ||
| 147 | case TUNNEL_FAIL_PAIR: return "relay connection died before pairing completed"; | ||
| 148 | case TUNNEL_FAIL_HANDSHAKE: return "end-to-end handshake failed"; | ||
| 149 | case TUNNEL_FAIL_LOCAL: return "local tunnel setup failed"; | ||
| 150 | } | ||
| 151 | return "unknown failure"; | ||
| 152 | } | ||
| 153 | |||
| 139 | btf_socket_t BtfClientTunnel(const char* meeting_host, unsigned short port, | 154 | btf_socket_t BtfClientTunnel(const char* meeting_host, unsigned short port, |
| 140 | const unsigned char target_pubkey[32], | 155 | const unsigned char target_pubkey[32], |
| 141 | const unsigned char service_enc_pub[32]) | 156 | const unsigned char service_enc_pub[32], |
| 157 | TunnelFail* pFail) | ||
| 142 | { | 158 | { |
| 159 | if (pFail) *pFail = TUNNEL_FAIL_INIT; | ||
| 143 | if (!TunnelInit()) return INVALID_SOCKET; | 160 | if (!TunnelInit()) return INVALID_SOCKET; |
| 144 | RvSocket rv = RvClientConnect(meeting_host, port, target_pubkey); | 161 | RvClientFail rvFail = RVC_FAIL_NONE; |
| 145 | if (rv == RV_INVALID) return INVALID_SOCKET; | 162 | RvSocket rv = RvClientConnect(meeting_host, port, target_pubkey, &rvFail); |
| 163 | if (rv == RV_INVALID) | ||
| 164 | { | ||
| 165 | if (pFail) | ||
| 166 | *pFail = rvFail == RVC_FAIL_DIAL ? TUNNEL_FAIL_DIAL | ||
| 167 | : rvFail == RVC_FAIL_REFUSED ? TUNNEL_FAIL_REFUSED | ||
| 168 | : TUNNEL_FAIL_PAIR; | ||
| 169 | return INVALID_SOCKET; | ||
| 170 | } | ||
| 146 | 171 | ||
| 147 | unsigned char eph_pub[32], shared[32]; | 172 | unsigned char eph_pub[32], shared[32]; |
| 173 | if (pFail) *pFail = TUNNEL_FAIL_HANDSHAKE; | ||
| 148 | if (!ChanClientHandshake(service_enc_pub, eph_pub, shared)) { RvClose(rv); return INVALID_SOCKET; } | 174 | if (!ChanClientHandshake(service_enc_pub, eph_pub, shared)) { RvClose(rv); return INVALID_SOCKET; } |
| 149 | if (!RvWriteN(rv, eph_pub, 32)) { RvClose(rv); return INVALID_SOCKET; } | 175 | if (!RvWriteN(rv, eph_pub, 32)) { RvClose(rv); return INVALID_SOCKET; } |
| 150 | return StartTunnel(rv, shared); | 176 | if (pFail) *pFail = TUNNEL_FAIL_LOCAL; |
| 177 | btf_socket_t app = StartTunnel(rv, shared); | ||
| 178 | if (app != INVALID_SOCKET && pFail) *pFail = TUNNEL_FAIL_NONE; | ||
| 179 | return app; | ||
| 151 | } | 180 | } |
| 152 | 181 | ||
| 153 | btf_socket_t BtfServiceWrap(RvSocket rv, const unsigned char my_enc_sk[32]) | 182 | btf_socket_t BtfServiceWrap(RvSocket rv, const unsigned char my_enc_sk[32]) |