diff --git a/common/sphinx.c b/common/sphinx.c index dd242a91b..9d6bf341d 100644 --- a/common/sphinx.c +++ b/common/sphinx.c @@ -683,6 +683,52 @@ struct onionpacket *create_onionpacket( return packet; } +/** + * Helper to extract fields from the legacy or tlv payload into the top-level + * struct. + */ +static void route_step_decode(struct route_step *rs) +{ + switch (rs->type) { + case SPHINX_V0_PAYLOAD: + rs->amt_to_forward = &rs->payload.v0.amt_forward; + rs->outgoing_cltv = &rs->payload.v0.outgoing_cltv; + if (rs->nextcase == ONION_FORWARD) { + rs->forward_channel = &rs->payload.v0.channel_id; + } else { + rs->forward_channel = NULL; + } + break; + case SPHINX_TLV_PAYLOAD: + if (rs->payload.tlv->amt_to_forward) { + rs->amt_to_forward = tal(rs, struct amount_msat); + amount_msat_from_u64( + rs->amt_to_forward, + rs->payload.tlv->amt_to_forward->amt_to_forward); + } else { + rs->amt_to_forward = NULL; + } + + if (rs->payload.tlv->outgoing_cltv_value) { + rs->outgoing_cltv = + &rs->payload.tlv->outgoing_cltv_value + ->outgoing_cltv_value; + } else { + rs->outgoing_cltv = NULL; + } + + if (rs->payload.tlv->short_channel_id) + rs->forward_channel = &rs->payload.tlv->short_channel_id + ->short_channel_id; + else + rs->forward_channel = NULL; + break; + case SPHINX_INVALID_PAYLOAD: + case SPHINX_RAW_PAYLOAD: + abort(); + } +} + /* * Given an onionpacket msg extract the information for the current * node and unwrap the remainder so that the node can forward it. @@ -754,6 +800,8 @@ struct route_step *process_onionpacket( step->nextcase = ONION_FORWARD; } + route_step_decode(step); + return step; } diff --git a/common/sphinx.h b/common/sphinx.h index e0478f93f..ad43be561 100644 --- a/common/sphinx.h +++ b/common/sphinx.h @@ -84,6 +84,11 @@ struct route_step { struct tlv_tlv_payload *tlv; } payload; u8 *raw_payload; + + /* Quick access for internal use. */ + struct amount_msat *amt_to_forward; + u32 *outgoing_cltv; + struct short_channel_id *forward_channel; }; /** diff --git a/common/test/run-sphinx.c b/common/test/run-sphinx.c index 71b93dc2a..7d1fe4850 100644 --- a/common/test/run-sphinx.c +++ b/common/test/run-sphinx.c @@ -18,6 +18,9 @@ bool amount_asset_is_main(struct amount_asset *asset UNNEEDED) /* Generated stub for amount_asset_to_sat */ struct amount_sat amount_asset_to_sat(struct amount_asset *asset UNNEEDED) { fprintf(stderr, "amount_asset_to_sat called!\n"); abort(); } +/* Generated stub for amount_msat_from_u64 */ +void amount_msat_from_u64(struct amount_msat *msat UNNEEDED, u64 millisatoshis UNNEEDED) +{ fprintf(stderr, "amount_msat_from_u64 called!\n"); abort(); } /* Generated stub for amount_sat_add */ bool amount_sat_add(struct amount_sat *val UNNEEDED, struct amount_sat a UNNEEDED,