upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src/btftunnel.cpp
diff options
context:
space:
mode:
authorbitflash-maintainer <noreply@bitflash.invalid>2026-09-02 09:03:01 +0000
committerbitflash-maintainer <noreply@bitflash.invalid>2026-09-02 09:03:01 +0000
commit7c70eb4498e88725241493033edfe89554ff1b18 (patch)
treea053678bf029d17c3a0b193fbaaf1abaf3778aff /src/btftunnel.cpp
parente4f898c4a6b9900553c64b9804889b5fdae3e55f (diff)
tunnel: report which stage failed instead of guessing the cause
Diffstat (limited to 'src/btftunnel.cpp')
-rw-r--r--src/btftunnel.cpp37
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
139const 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
139btf_socket_t BtfClientTunnel(const char* meeting_host, unsigned short port, 154btf_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
153btf_socket_t BtfServiceWrap(RvSocket rv, const unsigned char my_enc_sk[32]) 182btf_socket_t BtfServiceWrap(RvSocket rv, const unsigned char my_enc_sk[32])