From 9e98d01d029b198a6e57a91a05879a3d39f9b474 Mon Sep 17 00:00:00 2001 From: Michael Schmoock Date: Thu, 30 May 2019 13:36:35 +0200 Subject: [PATCH] feat: pass htlc amount exceeded to exception --- channeld/channeld.c | 7 ++++--- channeld/full_channel.c | 11 +++++++---- channeld/full_channel.h | 3 ++- channeld/test/run-full_channel.c | 4 ++-- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/channeld/channeld.c b/channeld/channeld.c index 87ced63ef..2b2631498 100644 --- a/channeld/channeld.c +++ b/channeld/channeld.c @@ -644,7 +644,7 @@ static void handle_peer_add_htlc(struct peer *peer, const u8 *msg) add_err = channel_add_htlc(peer->channel, REMOTE, id, amount, cltv_expiry, &payment_hash, - onion_routing_packet, &htlc); + onion_routing_packet, &htlc, NULL); if (add_err != CHANNEL_ERR_ADD_OK) peer_failed(peer->pps, &peer->channel_id, @@ -2532,6 +2532,7 @@ static void handle_offer_htlc(struct peer *peer, const u8 *inmsg) enum onion_type failcode; /* Subtle: must be tal object since we marshal using tal_bytelen() */ const char *failmsg; + struct amount_sat htlc_fee; if (!peer->funding_locked[LOCAL] || !peer->funding_locked[REMOTE]) status_failed(STATUS_FAIL_MASTER_IO, @@ -2544,7 +2545,7 @@ static void handle_offer_htlc(struct peer *peer, const u8 *inmsg) e = channel_add_htlc(peer->channel, LOCAL, peer->htlc_id, amount, cltv_expiry, &payment_hash, - onion_routing_packet, NULL); + onion_routing_packet, NULL, &htlc_fee); status_trace("Adding HTLC %"PRIu64" amount=%s cltv=%u gave %s", peer->htlc_id, type_to_string(tmpctx, struct amount_msat, &amount), @@ -2582,7 +2583,7 @@ static void handle_offer_htlc(struct peer *peer, const u8 *inmsg) goto failed; case CHANNEL_ERR_CHANNEL_CAPACITY_EXCEEDED: failcode = WIRE_TEMPORARY_CHANNEL_FAILURE; - failmsg = tal_fmt(inmsg, "Capacity exceeded"); + failmsg = tal_fmt(inmsg, "Capacity exceeded - HTLC fee: %s", fmt_amount_sat(inmsg, &htlc_fee)); goto failed; case CHANNEL_ERR_HTLC_BELOW_MINIMUM: failcode = WIRE_AMOUNT_BELOW_MINIMUM; diff --git a/channeld/full_channel.c b/channeld/full_channel.c index 31f4352ce..464ff1640 100644 --- a/channeld/full_channel.c +++ b/channeld/full_channel.c @@ -299,7 +299,8 @@ static enum channel_add_err add_htlc(struct channel *channel, const struct sha256 *payment_hash, const u8 routing[TOTAL_PACKET_SIZE], struct htlc **htlcp, - bool enforce_aggregate_limits) + bool enforce_aggregate_limits, + struct amount_sat *htlc_fee) { struct htlc *htlc, *old; struct amount_msat msat_in_htlcs, committed_msat, adding_msat, removing_msat; @@ -448,6 +449,7 @@ static enum channel_add_err add_htlc(struct channel *channel, fee = AMOUNT_SAT(0); assert((s64)fee.satoshis >= 0); /* Raw: explicit signedness test */ + if (htlc_fee) *htlc_fee = fee; /* set fee output pointer if given */ if (enforce_aggregate_limits) { /* Figure out what balance sender would have after applying all @@ -520,7 +522,8 @@ enum channel_add_err channel_add_htlc(struct channel *channel, u32 cltv_expiry, const struct sha256 *payment_hash, const u8 routing[TOTAL_PACKET_SIZE], - struct htlc **htlcp) + struct htlc **htlcp, + struct amount_sat *htlc_fee) { enum htlc_state state; @@ -530,7 +533,7 @@ enum channel_add_err channel_add_htlc(struct channel *channel, state = RCVD_ADD_HTLC; return add_htlc(channel, state, id, amount, cltv_expiry, - payment_hash, routing, htlcp, true); + payment_hash, routing, htlcp, true, htlc_fee); } struct htlc *channel_get_htlc(struct channel *channel, enum side sender, u64 id) @@ -1084,7 +1087,7 @@ bool channel_force_htlcs(struct channel *channel, htlcs[i].id, htlcs[i].amount, htlcs[i].cltv_expiry, &htlcs[i].payment_hash, - htlcs[i].onion_routing_packet, &htlc, false); + htlcs[i].onion_routing_packet, &htlc, false, NULL); if (e != CHANNEL_ERR_ADD_OK) { status_trace("%s HTLC %"PRIu64" failed error %u", htlc_state_owner(hstates[i]) == LOCAL diff --git a/channeld/full_channel.h b/channeld/full_channel.h index 427487d1c..3c2e6e7bb 100644 --- a/channeld/full_channel.h +++ b/channeld/full_channel.h @@ -104,7 +104,8 @@ enum channel_add_err channel_add_htlc(struct channel *channel, u32 cltv_expiry, const struct sha256 *payment_hash, const u8 routing[TOTAL_PACKET_SIZE], - struct htlc **htlcp); + struct htlc **htlcp, + struct amount_sat *htlc_fee); /** * channel_get_htlc: find an HTLC diff --git a/channeld/test/run-full_channel.c b/channeld/test/run-full_channel.c index 6b7e2bda9..26be3ceb1 100644 --- a/channeld/test/run-full_channel.c +++ b/channeld/test/run-full_channel.c @@ -150,7 +150,7 @@ static const struct htlc **include_htlcs(struct channel *channel, enum side side memset(&preimage, i, sizeof(preimage)); sha256(&hash, &preimage, sizeof(preimage)); e = channel_add_htlc(channel, sender, i, msatoshi, 500+i, &hash, - dummy_routing, NULL); + dummy_routing, NULL, NULL); assert(e == CHANNEL_ERR_ADD_OK); htlcs[i] = channel_get_htlc(channel, sender, i); } @@ -242,7 +242,7 @@ static void send_and_fulfill_htlc(struct channel *channel, sha256(&rhash, &r, sizeof(r)); assert(channel_add_htlc(channel, sender, 1337, msatoshi, 900, &rhash, - dummy_routing, NULL) == CHANNEL_ERR_ADD_OK); + dummy_routing, NULL, NULL) == CHANNEL_ERR_ADD_OK); changed_htlcs = tal_arr(channel, const struct htlc *, 0);