Browse Source

pay: Make `erring_node` optional in `struct routing_failure`

When using `sendonion` with `shared_secrets` we may be able to decode the
onioned error message but we cannot infer which node reported the failure
since we don't know which nodes where involved.
travis-debug
Christian Decker 5 years ago
parent
commit
88961aa4b0
  1. 30
      lightningd/pay.c

30
lightningd/pay.c

@ -24,7 +24,7 @@
struct routing_failure { struct routing_failure {
unsigned int erring_index; unsigned int erring_index;
enum onion_type failcode; enum onion_type failcode;
struct node_id erring_node; const struct node_id *erring_node;
struct short_channel_id erring_channel; struct short_channel_id erring_channel;
int channel_dir; int channel_dir;
/* If remote sent us a message, this is it. */ /* If remote sent us a message, this is it. */
@ -139,9 +139,11 @@ json_add_routefail_info(struct json_stream *js,
/* FIXME: Better way to detect this? */ /* FIXME: Better way to detect this? */
if (!strstarts(failcodename, "INVALID ")) if (!strstarts(failcodename, "INVALID "))
json_add_string(js, "failcodename", failcodename); json_add_string(js, "failcodename", failcodename);
json_add_node_id(js, "erring_node", erring_node);
json_add_short_channel_id(js, "erring_channel", erring_channel); json_add_short_channel_id(js, "erring_channel", erring_channel);
json_add_num(js, "erring_direction", channel_dir); json_add_num(js, "erring_direction", channel_dir);
if (erring_node != NULL)
json_add_node_id(js, "erring_node", erring_node);
if (msg) if (msg)
json_add_hex_talarr(js, "raw_message", msg); json_add_hex_talarr(js, "raw_message", msg);
} }
@ -161,7 +163,7 @@ void json_sendpay_fail_fields(struct json_stream *js,
json_add_routefail_info(js, json_add_routefail_info(js,
fail->erring_index, fail->erring_index,
fail->failcode, fail->failcode,
&fail->erring_node, fail->erring_node,
&fail->erring_channel, &fail->erring_channel,
fail->channel_dir, fail->channel_dir,
fail->msg); fail->msg);
@ -286,7 +288,8 @@ immediate_routing_failure(const tal_t *ctx,
routing_failure = tal(ctx, struct routing_failure); routing_failure = tal(ctx, struct routing_failure);
routing_failure->erring_index = 0; routing_failure->erring_index = 0;
routing_failure->failcode = failcode; routing_failure->failcode = failcode;
routing_failure->erring_node = ld->id; routing_failure->erring_node =
tal_dup(routing_failure, struct node_id, &ld->id);
routing_failure->erring_channel = *channel0; routing_failure->erring_channel = *channel0;
routing_failure->channel_dir = node_id_idx(&ld->id, dstid); routing_failure->channel_dir = node_id_idx(&ld->id, dstid);
routing_failure->msg = NULL; routing_failure->msg = NULL;
@ -309,7 +312,8 @@ local_routing_failure(const tal_t *ctx,
routing_failure = tal(ctx, struct routing_failure); routing_failure = tal(ctx, struct routing_failure);
routing_failure->erring_index = 0; routing_failure->erring_index = 0;
routing_failure->failcode = hout->failcode; routing_failure->failcode = hout->failcode;
routing_failure->erring_node = ld->id; routing_failure->erring_node =
tal_dup(routing_failure, struct node_id, &ld->id);
routing_failure->erring_channel = payment->route_channels[0]; routing_failure->erring_channel = payment->route_channels[0];
routing_failure->channel_dir = node_id_idx(&ld->id, routing_failure->channel_dir = node_id_idx(&ld->id,
&payment->route_nodes[0]); &payment->route_nodes[0]);
@ -343,9 +347,8 @@ remote_routing_failure(const tal_t *ctx,
route_channels = payment->route_channels; route_channels = payment->route_channels;
origin_index = failure->origin_index; origin_index = failure->origin_index;
assert(origin_index < tal_count(route_nodes)); assert(route_nodes == NULL || origin_index < tal_count(route_nodes));
/* Check if at destination. */
if (origin_index == tal_count(route_nodes) - 1) { if (origin_index == tal_count(route_nodes) - 1) {
/* If any channel is to blame, it's the last one. */ /* If any channel is to blame, it's the last one. */
erring_channel = &route_channels[origin_index]; erring_channel = &route_channels[origin_index];
@ -402,12 +405,18 @@ remote_routing_failure(const tal_t *ctx,
routing_failure->erring_index = (unsigned int) (origin_index + 1); routing_failure->erring_index = (unsigned int) (origin_index + 1);
routing_failure->failcode = failcode; routing_failure->failcode = failcode;
routing_failure->erring_node = *erring_node;
routing_failure->erring_channel = *erring_channel; routing_failure->erring_channel = *erring_channel;
routing_failure->erring_node = tal_dup(routing_failure, struct node_id, erring_node);
routing_failure->channel_dir = dir; routing_failure->channel_dir = dir;
routing_failure->msg = tal_dup_arr(routing_failure, u8, failure->msg, routing_failure->msg = tal_dup_arr(routing_failure, u8, failure->msg,
tal_count(failure->msg), 0); tal_count(failure->msg), 0);
if (erring_node != NULL)
routing_failure->erring_node =
tal_dup(routing_failure, struct node_id, erring_node);
else
routing_failure->erring_node = NULL;
return routing_failure; return routing_failure;
} }
@ -519,7 +528,7 @@ void payment_failed(struct lightningd *ld, const struct htlc_out *hout,
pay_errcode == PAY_DESTINATION_PERM_FAIL, pay_errcode == PAY_DESTINATION_PERM_FAIL,
fail ? fail->erring_index : -1, fail ? fail->erring_index : -1,
fail ? fail->failcode : 0, fail ? fail->failcode : 0,
fail ? &fail->erring_node : NULL, fail ? fail->erring_node : NULL,
fail ? &fail->erring_channel : NULL, fail ? &fail->erring_channel : NULL,
NULL, NULL,
failmsg, failmsg,
@ -594,7 +603,8 @@ static struct command_result *wait_payment(struct lightningd *ld,
fail = tal(tmpctx, struct routing_failure); fail = tal(tmpctx, struct routing_failure);
fail->erring_index = failindex; fail->erring_index = failindex;
fail->failcode = failcode; fail->failcode = failcode;
fail->erring_node = *failnode; fail->erring_node =
tal_dup(fail, struct node_id, failnode);
fail->erring_channel = *failchannel; fail->erring_channel = *failchannel;
fail->channel_dir = faildirection; fail->channel_dir = faildirection;
/* FIXME: We don't store this! */ /* FIXME: We don't store this! */

Loading…
Cancel
Save