channeld: don't attach channel_update to errors, let lightningd do it.

This is far simpler: lightningd no longer needs to tell channeld when updates change, etc.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2023-10-24 14:20:06 +10:30
parent 075f79033a
commit 222da7f185
4 changed files with 11 additions and 54 deletions

View file

@ -217,9 +217,6 @@ struct peer {
* channel with the real scid. */
bool gossip_scid_announced;
/* Most recent channel_update message. */
u8 *channel_update;
/* --experimental-upgrade-protocol */
bool experimental_upgrade;
};
@ -5299,15 +5296,6 @@ static void handle_funding_depth(struct peer *peer, const u8 *msg)
billboard_update(peer);
}
static const u8 *get_cupdate(const struct peer *peer)
{
/* Technically we only need to tell it the first time (unless it's
* changed). But it's not that common. */
wire_sync_write(MASTER_FD,
take(towire_channeld_used_channel_update(NULL)));
return peer->channel_update;
}
static void handle_offer_htlc(struct peer *peer, const u8 *inmsg)
{
u8 *msg;
@ -5363,7 +5351,7 @@ static void handle_offer_htlc(struct peer *peer, const u8 *inmsg)
peer->htlc_id++;
return;
case CHANNEL_ERR_INVALID_EXPIRY:
failwiremsg = towire_incorrect_cltv_expiry(inmsg, cltv_expiry, get_cupdate(peer));
failwiremsg = towire_incorrect_cltv_expiry(inmsg, cltv_expiry, NULL);
failstr = tal_fmt(inmsg, "Invalid cltv_expiry %u", cltv_expiry);
goto failed;
case CHANNEL_ERR_DUPLICATE:
@ -5377,18 +5365,18 @@ static void handle_offer_htlc(struct peer *peer, const u8 *inmsg)
goto failed;
/* FIXME: Fuzz the boundaries a bit to avoid probing? */
case CHANNEL_ERR_CHANNEL_CAPACITY_EXCEEDED:
failwiremsg = towire_temporary_channel_failure(inmsg, get_cupdate(peer));
failwiremsg = towire_temporary_channel_failure(inmsg, NULL);
failstr = tal_fmt(inmsg, "Capacity exceeded - HTLC fee: %s", fmt_amount_sat(inmsg, htlc_fee));
goto failed;
case CHANNEL_ERR_HTLC_BELOW_MINIMUM:
failwiremsg = towire_amount_below_minimum(inmsg, amount, get_cupdate(peer));
failwiremsg = towire_amount_below_minimum(inmsg, amount, NULL);
failstr = tal_fmt(inmsg, "HTLC too small (%s minimum)",
type_to_string(tmpctx,
struct amount_msat,
&peer->channel->config[REMOTE].htlc_minimum));
goto failed;
case CHANNEL_ERR_TOO_MANY_HTLCS:
failwiremsg = towire_temporary_channel_failure(inmsg, get_cupdate(peer));
failwiremsg = towire_temporary_channel_failure(inmsg, NULL);
failstr = "Too many HTLCs";
goto failed;
case CHANNEL_ERR_DUST_FAILURE:
@ -5398,7 +5386,7 @@ static void handle_offer_htlc(struct peer *peer, const u8 *inmsg)
* - SHOULD NOT send this HTLC
* - SHOULD fail this HTLC if it's forwarded
*/
failwiremsg = towire_temporary_channel_failure(inmsg, get_cupdate(peer));
failwiremsg = towire_temporary_channel_failure(inmsg, NULL);
failstr = "HTLC too dusty, allowed dust limit reached";
goto failed;
}
@ -5406,6 +5394,7 @@ static void handle_offer_htlc(struct peer *peer, const u8 *inmsg)
abort();
failed:
/* lightningd appends update to this for us */
msg = towire_channeld_offer_htlc_reply(NULL, 0, failwiremsg, failstr);
wire_sync_write(MASTER_FD, take(msg));
}
@ -5612,14 +5601,6 @@ static void handle_shutdown_cmd(struct peer *peer, const u8 *inmsg)
start_commit_timer(peer);
}
/* Lightningd tells us when channel_update has changed. */
static void handle_channel_update(struct peer *peer, const u8 *msg)
{
peer->channel_update = tal_free(peer->channel_update);
if (!fromwire_channeld_channel_update(peer, msg, &peer->channel_update))
master_badmsg(WIRE_CHANNELD_CHANNEL_UPDATE, msg);
}
static void handle_send_error(struct peer *peer, const u8 *msg)
{
char *reason;
@ -5719,9 +5700,6 @@ static void req_in(struct peer *peer, const u8 *msg)
case WIRE_CHANNELD_SEND_ERROR:
handle_send_error(peer, msg);
return;
case WIRE_CHANNELD_CHANNEL_UPDATE:
handle_channel_update(peer, msg);
return;
case WIRE_CHANNELD_SPLICE_INIT:
handle_splice_init(peer, msg);
return;
@ -5776,7 +5754,6 @@ static void req_in(struct peer *peer, const u8 *msg)
case WIRE_CHANNELD_SEND_ERROR_REPLY:
case WIRE_CHANNELD_DEV_QUIESCE_REPLY:
case WIRE_CHANNELD_UPGRADED:
case WIRE_CHANNELD_USED_CHANNEL_UPDATE:
case WIRE_CHANNELD_LOCAL_CHANNEL_UPDATE:
case WIRE_CHANNELD_LOCAL_CHANNEL_ANNOUNCEMENT:
case WIRE_CHANNELD_LOCAL_PRIVATE_CHANNEL:
@ -5879,7 +5856,6 @@ static void init_channel(struct peer *peer)
&peer->dev_disable_commit,
&pbases,
&reestablish_only,
&peer->channel_update,
&peer->experimental_upgrade,
&peer->splice_state->inflights)) {
master_badmsg(WIRE_CHANNELD_INIT, msg);

View file

@ -81,8 +81,6 @@ msgdata,channeld_init,dev_disable_commit,?u32,
msgdata,channeld_init,num_penalty_bases,u32,
msgdata,channeld_init,pbases,penalty_base,num_penalty_bases
msgdata,channeld_init,reestablish_only,bool,
msgdata,channeld_init,channel_update_len,u16,
msgdata,channeld_init,channel_update,u8,channel_update_len
msgdata,channeld_init,experimental_upgrade,bool,
msgdata,channeld_init,num_inflights,u16,
msgdata,channeld_init,inflights,inflight,num_inflights
@ -331,14 +329,6 @@ msgdata,channeld_send_error,reason,wirestring,
# Tell master channeld has sent the error message.
msgtype,channeld_send_error_reply,1108
# Tell channeld about the latest channel_update
msgtype,channeld_channel_update,1001
msgdata,channeld_channel_update,len,u16,
msgdata,channeld_channel_update,msg,u8,len
# Tell lightningd we used the latest channel_update for an error.
msgtype,channeld_used_channel_update,1102
# Channeld: tell gossipd to make this channel_update.
msgtype,channeld_local_channel_update,1013
msgdata,channeld_local_channel_update,short_channel_id,short_channel_id,

Can't render this file because it has a wrong number of fields in line 15.

View file

@ -1240,10 +1240,6 @@ static unsigned channel_msg(struct subd *sd, const u8 *msg, const int *fds)
case WIRE_CHANNELD_SEND_ERROR_REPLY:
handle_error_channel(sd->channel, msg);
break;
case WIRE_CHANNELD_USED_CHANNEL_UPDATE:
/* This tells gossipd we used it. */
get_channel_update(sd->channel);
break;
case WIRE_CHANNELD_LOCAL_CHANNEL_UPDATE:
tell_gossipd_local_channel_update(sd->ld, sd->channel, msg);
break;
@ -1300,7 +1296,6 @@ static unsigned channel_msg(struct subd *sd, const u8 *msg, const int *fds)
case WIRE_CHANNELD_FEERATES:
case WIRE_CHANNELD_BLOCKHEIGHT:
case WIRE_CHANNELD_CONFIG_CHANNEL:
case WIRE_CHANNELD_CHANNEL_UPDATE:
case WIRE_CHANNELD_DEV_MEMLEAK:
case WIRE_CHANNELD_DEV_QUIESCE:
case WIRE_CHANNELD_GOT_INFLIGHT:
@ -1560,7 +1555,6 @@ bool peer_start_channeld(struct channel *channel,
: (u32 *)&ld->dev_disable_commit,
pbases,
reestablish_only,
channel->channel_update,
ld->experimental_upgrade_protocol,
cast_const2(const struct inflight **,
inflights));
@ -1837,14 +1831,6 @@ void channel_replace_update(struct channel *channel, u8 *update TAKES)
{
tal_free(channel->channel_update);
channel->channel_update = tal_dup_talarr(channel, u8, update);
/* Keep channeld up-to-date */
if (!channel->owner || !streq(channel->owner->name, "channeld"))
return;
subd_send_msg(channel->owner,
take(towire_channeld_channel_update(NULL,
channel->channel_update)));
}
static struct command_result *param_channel_for_splice(struct command *cmd,

View file

@ -527,6 +527,11 @@ static void rcvd_htlc_reply(struct subd *subd, const u8 *msg, const int *fds UNU
}
if (tal_count(failmsg)) {
/* It's our job to append the channel_update */
if (fromwire_peektype(failmsg) & UPDATE) {
const u8 *update = get_channel_update(hout->key.channel);
towire(&failmsg, update, tal_bytelen(update));
}
hout->failmsg = tal_steal(hout, failmsg);
if (hout->am_origin) {
char *localfail = tal_fmt(msg, "%s: %s",