diff --git a/gossipd/gossip.c b/gossipd/gossip.c index ca03f1bda..88adb492b 100644 --- a/gossipd/gossip.c +++ b/gossipd/gossip.c @@ -1833,6 +1833,73 @@ static struct wireaddr_internal *setup_listeners(const tal_t *ctx, return binding; } +static void gossip_disable_channel(struct routing_state *rstate, struct chan *chan) +{ + struct short_channel_id scid; + u8 direction; + struct half_chan *hc; + u16 flags, cltv_expiry_delta; + u32 timestamp, fee_base_msat, fee_proportional_millionths; + struct bitcoin_blkid chain_hash; + secp256k1_ecdsa_signature sig; + u64 htlc_minimum_msat; + u8 *err, *msg; + + direction = pubkey_eq(&chan->nodes[0]->id, &rstate->local_id)?0:1; + assert(chan); + hc = &chan->half[direction]; + + if (!is_halfchan_defined(hc)) + return; + + status_trace("Disabling channel %s/%d, active %d -> %d", + type_to_string(tmpctx, struct short_channel_id, &chan->scid), + direction, is_halfchan_enabled(hc), 0); + + if (!fromwire_channel_update( + hc->channel_update, &sig, &chain_hash, &scid, ×tamp, + &flags, &cltv_expiry_delta, &htlc_minimum_msat, &fee_base_msat, + &fee_proportional_millionths)) { + status_failed( + STATUS_FAIL_INTERNAL_ERROR, + "Unable to parse previously accepted channel_update"); + } + + /* Avoid sending gratuitous disable messages, e.g., on close and + * subsequent disconnect */ + if (flags & ROUTING_FLAGS_DISABLED) + return; + + timestamp = time_now().ts.tv_sec; + if (timestamp <= hc->last_timestamp) + timestamp = hc->last_timestamp + 1; + + flags = flags | ROUTING_FLAGS_DISABLED; + + msg = towire_channel_update(tmpctx, &sig, &chain_hash, &scid, timestamp, + flags, cltv_expiry_delta, htlc_minimum_msat, + fee_base_msat, fee_proportional_millionths); + + if (!wire_sync_write(HSM_FD, + towire_hsm_cupdate_sig_req(tmpctx, msg))) { + status_failed(STATUS_FAIL_HSM_IO, "Writing cupdate_sig_req: %s", + strerror(errno)); + } + + msg = wire_sync_read(tmpctx, HSM_FD); + if (!msg || !fromwire_hsm_cupdate_sig_reply(tmpctx, msg, &msg)) { + status_failed(STATUS_FAIL_HSM_IO, + "Reading cupdate_sig_req: %s", + strerror(errno)); + } + + err = handle_channel_update(rstate, msg, "disable_channel"); + if (err) + status_failed(STATUS_FAIL_INTERNAL_ERROR, + "rejected disabling channel_update: %s", + tal_hex(tmpctx, err)); +} + /* Parse an incoming gossip init message and assign config variables * to the daemon. */ @@ -2355,84 +2422,6 @@ static struct io_plan *peer_important(struct io_conn *conn, return daemon_conn_read_next(conn, &daemon->master); } -static void gossip_disable_channel(struct routing_state *rstate, struct chan *chan) -{ - struct short_channel_id scid; - u8 direction; - struct half_chan *hc; - u16 flags, cltv_expiry_delta; - u32 timestamp, fee_base_msat, fee_proportional_millionths; - struct bitcoin_blkid chain_hash; - secp256k1_ecdsa_signature sig; - u64 htlc_minimum_msat; - u8 *err, *msg; - - direction = pubkey_eq(&chan->nodes[0]->id, &rstate->local_id)?0:1; - - assert(chan); - hc = &chan->half[direction]; - - status_trace("Disabling channel %s/%d, active %d -> %d", - type_to_string(tmpctx, struct short_channel_id, &chan->scid), - direction, is_halfchan_enabled(hc), 0); - - if (!is_halfchan_defined(hc)) { - status_trace( - "Channel %s/%d doesn't have a channel_update yet, can't " - "disable", - type_to_string(tmpctx, struct short_channel_id, &scid), - direction); - return; - } - - if (!fromwire_channel_update( - hc->channel_update, &sig, &chain_hash, &scid, ×tamp, - &flags, &cltv_expiry_delta, &htlc_minimum_msat, &fee_base_msat, - &fee_proportional_millionths)) { - status_failed( - STATUS_FAIL_INTERNAL_ERROR, - "Unable to parse previously accepted channel_update"); - } - - /* Avoid sending gratuitous disable messages, e.g., on close and - * subsequent disconnect */ - if (flags & ROUTING_FLAGS_DISABLED) - return; - - status_trace("Disabling channel %s", type_to_string(tmpctx, struct short_channel_id, &scid)); - - timestamp = time_now().ts.tv_sec; - if (timestamp <= hc->last_timestamp) - timestamp = hc->last_timestamp + 1; - - status_trace("Disabling channel %s: %d", type_to_string(tmpctx, struct short_channel_id, &scid), 0); - - flags = flags | ROUTING_FLAGS_DISABLED; - - msg = towire_channel_update(tmpctx, &sig, &chain_hash, &scid, timestamp, - flags, cltv_expiry_delta, htlc_minimum_msat, - fee_base_msat, fee_proportional_millionths); - - if (!wire_sync_write(HSM_FD, - towire_hsm_cupdate_sig_req(tmpctx, msg))) { - status_failed(STATUS_FAIL_HSM_IO, "Writing cupdate_sig_req: %s", - strerror(errno)); - } - - msg = wire_sync_read(tmpctx, HSM_FD); - if (!msg || !fromwire_hsm_cupdate_sig_reply(tmpctx, msg, &msg)) { - status_failed(STATUS_FAIL_HSM_IO, - "Reading cupdate_sig_req: %s", - strerror(errno)); - } - - err = handle_channel_update(rstate, msg, "disable_channel"); - if (err) - status_failed(STATUS_FAIL_INTERNAL_ERROR, - "rejected disabling channel_update: %s", - tal_hex(tmpctx, err)); -} - static void peer_disable_channels(struct routing_state *rstate, struct node *node) { struct chan *c;