diff --git a/channeld/channel.c b/channeld/channel.c index 17d534c58..a635a8b1a 100644 --- a/channeld/channel.c +++ b/channeld/channel.c @@ -800,6 +800,110 @@ static u8 *gossipd_wait_sync_reply(const tal_t *ctx, GOSSIP_FD, &peer->from_gossipd, "gossipd"); } +static u8 *foreign_channel_update(const tal_t *ctx, + struct peer *peer, + const struct short_channel_id *scid) +{ + u8 *msg, *update; + + msg = towire_gossip_get_update(NULL, scid); + msg = gossipd_wait_sync_reply(tmpctx, peer, take(msg), + WIRE_GOSSIP_GET_UPDATE_REPLY); + if (!fromwire_gossip_get_update_reply(ctx, msg, &update)) + status_failed(STATUS_FAIL_GOSSIP_IO, + "Invalid update reply"); + return update; +} + +static u8 *make_failmsg(const tal_t *ctx, + struct peer *peer, + const struct htlc *htlc, + enum onion_type failcode, + const struct short_channel_id *scid) +{ + u8 *msg, *channel_update = NULL; + u32 cltv_expiry = abs_locktime_to_blocks(&htlc->expiry); + + switch (failcode) { + case WIRE_INVALID_REALM: + msg = towire_invalid_realm(ctx); + goto done; + case WIRE_TEMPORARY_NODE_FAILURE: + msg = towire_temporary_node_failure(ctx); + goto done; + case WIRE_PERMANENT_NODE_FAILURE: + msg = towire_permanent_node_failure(ctx); + goto done; + case WIRE_REQUIRED_NODE_FEATURE_MISSING: + msg = towire_required_node_feature_missing(ctx); + goto done; + case WIRE_TEMPORARY_CHANNEL_FAILURE: + channel_update = foreign_channel_update(ctx, peer, scid); + msg = towire_temporary_channel_failure(ctx, channel_update); + goto done; + case WIRE_CHANNEL_DISABLED: + msg = towire_channel_disabled(ctx); + goto done; + case WIRE_PERMANENT_CHANNEL_FAILURE: + msg = towire_permanent_channel_failure(ctx); + goto done; + case WIRE_REQUIRED_CHANNEL_FEATURE_MISSING: + msg = towire_required_channel_feature_missing(ctx); + goto done; + case WIRE_UNKNOWN_NEXT_PEER: + msg = towire_unknown_next_peer(ctx); + goto done; + case WIRE_AMOUNT_BELOW_MINIMUM: + channel_update = foreign_channel_update(ctx, peer, scid); + msg = towire_amount_below_minimum(ctx, htlc->msatoshi, + channel_update); + goto done; + case WIRE_FEE_INSUFFICIENT: + channel_update = foreign_channel_update(ctx, peer, scid); + msg = towire_fee_insufficient(ctx, htlc->msatoshi, + channel_update); + goto done; + case WIRE_INCORRECT_CLTV_EXPIRY: + channel_update = foreign_channel_update(ctx, peer, scid); + msg = towire_incorrect_cltv_expiry(ctx, cltv_expiry, + channel_update); + goto done; + case WIRE_EXPIRY_TOO_SOON: + channel_update = foreign_channel_update(ctx, peer, scid); + msg = towire_expiry_too_soon(ctx, channel_update); + goto done; + case WIRE_EXPIRY_TOO_FAR: + msg = towire_expiry_too_far(ctx); + goto done; + case WIRE_UNKNOWN_PAYMENT_HASH: + msg = towire_unknown_payment_hash(ctx); + goto done; + case WIRE_INCORRECT_PAYMENT_AMOUNT: + msg = towire_incorrect_payment_amount(ctx); + goto done; + case WIRE_FINAL_EXPIRY_TOO_SOON: + msg = towire_final_expiry_too_soon(ctx); + goto done; + case WIRE_FINAL_INCORRECT_CLTV_EXPIRY: + msg = towire_final_incorrect_cltv_expiry(ctx, cltv_expiry); + goto done; + case WIRE_FINAL_INCORRECT_HTLC_AMOUNT: + msg = towire_final_incorrect_htlc_amount(ctx, htlc->msatoshi); + goto done; + case WIRE_INVALID_ONION_VERSION: + case WIRE_INVALID_ONION_HMAC: + case WIRE_INVALID_ONION_KEY: + break; + } + status_failed(STATUS_FAIL_INTERNAL_ERROR, + "Asked to create failmsg %u (%s)", + failcode, onion_type_name(failcode)); + +done: + tal_free(channel_update); + return msg; +} + static struct commit_sigs *calc_commitsigs(const tal_t *ctx, const struct peer *peer, u64 commit_index) @@ -2119,110 +2223,6 @@ static void handle_preimage(struct peer *peer, const u8 *inmsg) abort(); } -static u8 *foreign_channel_update(const tal_t *ctx, - struct peer *peer, - const struct short_channel_id *scid) -{ - u8 *msg, *update; - - msg = towire_gossip_get_update(NULL, scid); - msg = gossipd_wait_sync_reply(tmpctx, peer, take(msg), - WIRE_GOSSIP_GET_UPDATE_REPLY); - if (!fromwire_gossip_get_update_reply(ctx, msg, &update)) - status_failed(STATUS_FAIL_GOSSIP_IO, - "Invalid update reply"); - return update; -} - -static u8 *make_failmsg(const tal_t *ctx, - struct peer *peer, - const struct htlc *htlc, - enum onion_type failcode, - const struct short_channel_id *scid) -{ - u8 *msg, *channel_update = NULL; - u32 cltv_expiry = abs_locktime_to_blocks(&htlc->expiry); - - switch (failcode) { - case WIRE_INVALID_REALM: - msg = towire_invalid_realm(ctx); - goto done; - case WIRE_TEMPORARY_NODE_FAILURE: - msg = towire_temporary_node_failure(ctx); - goto done; - case WIRE_PERMANENT_NODE_FAILURE: - msg = towire_permanent_node_failure(ctx); - goto done; - case WIRE_REQUIRED_NODE_FEATURE_MISSING: - msg = towire_required_node_feature_missing(ctx); - goto done; - case WIRE_TEMPORARY_CHANNEL_FAILURE: - channel_update = foreign_channel_update(ctx, peer, scid); - msg = towire_temporary_channel_failure(ctx, channel_update); - goto done; - case WIRE_CHANNEL_DISABLED: - msg = towire_channel_disabled(ctx); - goto done; - case WIRE_PERMANENT_CHANNEL_FAILURE: - msg = towire_permanent_channel_failure(ctx); - goto done; - case WIRE_REQUIRED_CHANNEL_FEATURE_MISSING: - msg = towire_required_channel_feature_missing(ctx); - goto done; - case WIRE_UNKNOWN_NEXT_PEER: - msg = towire_unknown_next_peer(ctx); - goto done; - case WIRE_AMOUNT_BELOW_MINIMUM: - channel_update = foreign_channel_update(ctx, peer, scid); - msg = towire_amount_below_minimum(ctx, htlc->msatoshi, - channel_update); - goto done; - case WIRE_FEE_INSUFFICIENT: - channel_update = foreign_channel_update(ctx, peer, scid); - msg = towire_fee_insufficient(ctx, htlc->msatoshi, - channel_update); - goto done; - case WIRE_INCORRECT_CLTV_EXPIRY: - channel_update = foreign_channel_update(ctx, peer, scid); - msg = towire_incorrect_cltv_expiry(ctx, cltv_expiry, - channel_update); - goto done; - case WIRE_EXPIRY_TOO_SOON: - channel_update = foreign_channel_update(ctx, peer, scid); - msg = towire_expiry_too_soon(ctx, channel_update); - goto done; - case WIRE_EXPIRY_TOO_FAR: - msg = towire_expiry_too_far(ctx); - goto done; - case WIRE_UNKNOWN_PAYMENT_HASH: - msg = towire_unknown_payment_hash(ctx); - goto done; - case WIRE_INCORRECT_PAYMENT_AMOUNT: - msg = towire_incorrect_payment_amount(ctx); - goto done; - case WIRE_FINAL_EXPIRY_TOO_SOON: - msg = towire_final_expiry_too_soon(ctx); - goto done; - case WIRE_FINAL_INCORRECT_CLTV_EXPIRY: - msg = towire_final_incorrect_cltv_expiry(ctx, cltv_expiry); - goto done; - case WIRE_FINAL_INCORRECT_HTLC_AMOUNT: - msg = towire_final_incorrect_htlc_amount(ctx, htlc->msatoshi); - goto done; - case WIRE_INVALID_ONION_VERSION: - case WIRE_INVALID_ONION_HMAC: - case WIRE_INVALID_ONION_KEY: - break; - } - status_failed(STATUS_FAIL_INTERNAL_ERROR, - "Asked to create failmsg %u (%s)", - failcode, onion_type_name(failcode)); - -done: - tal_free(channel_update); - return msg; -} - static void handle_fail(struct peer *peer, const u8 *inmsg) { u8 *msg;