lightningd: metadata received support (log and decline).

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2022-03-31 19:40:50 +10:30
parent e01abf0b34
commit 4718ee076c
3 changed files with 37 additions and 2 deletions

View File

@ -241,6 +241,7 @@ struct onion_payload *onion_decode(const tal_t *ctx,
p->amt_to_forward = fromwire_amount_msat(&cursor, &max);
p->outgoing_cltv = fromwire_u32(&cursor, &max);
p->payment_secret = NULL;
p->payment_metadata = NULL;
p->blinding = NULL;
/* We can't handle blinding with a legacy payload */
if (blinding)
@ -365,6 +366,12 @@ struct onion_payload *onion_decode(const tal_t *ctx,
*p->total_msat
= amount_msat(tlv->payment_data->total_msat);
}
if (tlv->payment_metadata)
p->payment_metadata
= tal_dup_talarr(p, u8, tlv->payment_metadata);
else
p->payment_metadata = NULL;
p->tlv = tal_steal(p, tlv);
return p;

View File

@ -19,6 +19,7 @@ struct onion_payload {
struct amount_msat *total_msat;
struct short_channel_id *forward_channel;
struct secret *payment_secret;
u8 *payment_metadata;
/* If blinding is set, blinding_ss is the shared secret.*/
struct pubkey *blinding;

View File

@ -363,7 +363,8 @@ static void handle_localpay(struct htlc_in *hin,
struct amount_msat amt_to_forward,
u32 outgoing_cltv_value,
struct amount_msat total_msat,
const struct secret *payment_secret)
const struct secret *payment_secret,
const u8 *payment_metadata)
{
const u8 *failmsg;
struct lightningd *ld = hin->key.channel->peer->ld;
@ -424,6 +425,27 @@ static void handle_localpay(struct htlc_in *hin,
goto fail;
}
/* We don't expect payment_metadata; reject here */
if (payment_metadata) {
log_debug(hin->key.channel->log,
"Unexpected payment_metadata %s",
tal_hex(tmpctx, payment_metadata));
/* BOLT #4:
* 1. type: PERM|22 (`invalid_onion_payload`)
* 2. data:
* * [`bigsize`:`type`]
* * [`u16`:`offset`]
*
* The decrypted onion per-hop payload was not understood by the processing node
* or is incomplete. If the failure can be narrowed down to a specific tlv type in
* the payload, the erring node may include that `type` and its byte `offset` in
* the decrypted byte stream.
*/
failmsg = towire_invalid_onion_payload(NULL, TLV_TLV_PAYLOAD_PAYMENT_METADATA,
/* FIXME: offset? */ 0);
goto fail;
}
htlc_set_add(ld, hin, total_msat, payment_secret);
return;
@ -1033,6 +1055,10 @@ static void htlc_accepted_hook_serialize(struct htlc_accepted_hook_payload *p,
json_add_secret(s, "payment_secret",
p->payload->payment_secret);
}
if (p->payload->payment_metadata) {
json_add_hex_talarr(s, "payment_metadata",
p->payload->payment_metadata);
}
}
json_add_hex_talarr(s, "next_onion", p->next_onion);
json_add_secret(s, "shared_secret", hin->shared_secret);
@ -1082,7 +1108,8 @@ htlc_accepted_hook_final(struct htlc_accepted_hook_payload *request STEALS)
request->payload->amt_to_forward,
request->payload->outgoing_cltv,
*request->payload->total_msat,
request->payload->payment_secret);
request->payload->payment_secret,
request->payload->payment_metadata);
tal_free(request);
}