mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-02-22 06:41:44 +01:00
plugins/renepay: use struct short_channel_id_dir.
No changes, just use this convenience type for handing around, and arrays. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
a6c2cd77a1
commit
7287ade705
6 changed files with 88 additions and 104 deletions
|
@ -120,39 +120,38 @@ static void chan_extra_can_send_(
|
||||||
|
|
||||||
chan_extra_adjust_half(ce,!dir);
|
chan_extra_adjust_half(ce,!dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
void chan_extra_can_send(
|
void chan_extra_can_send(
|
||||||
struct chan_extra_map *chan_extra_map,
|
struct chan_extra_map *chan_extra_map,
|
||||||
struct short_channel_id scid,
|
const struct short_channel_id_dir *scidd,
|
||||||
int dir,
|
|
||||||
struct amount_msat x)
|
struct amount_msat x)
|
||||||
{
|
{
|
||||||
struct chan_extra *ce = chan_extra_map_get(chan_extra_map,
|
struct chan_extra *ce = chan_extra_map_get(chan_extra_map,
|
||||||
scid);
|
scidd->scid);
|
||||||
if(!ce)
|
if(!ce)
|
||||||
{
|
{
|
||||||
debug_err("%s unexpected chan_extra ce is NULL",
|
debug_err("%s unexpected chan_extra ce is NULL",
|
||||||
__PRETTY_FUNCTION__);
|
__PRETTY_FUNCTION__);
|
||||||
}
|
}
|
||||||
if(!amount_msat_add(&x,x,ce->half[dir].htlc_total))
|
if(!amount_msat_add(&x,x,ce->half[scidd->dir].htlc_total))
|
||||||
{
|
{
|
||||||
debug_err("%s (line %d) cannot add x=%s and htlc_total=%s",
|
debug_err("%s (line %d) cannot add x=%s and htlc_total=%s",
|
||||||
__PRETTY_FUNCTION__,__LINE__,
|
__PRETTY_FUNCTION__,__LINE__,
|
||||||
type_to_string(tmpctx,struct amount_msat,&x),
|
type_to_string(tmpctx,struct amount_msat,&x),
|
||||||
type_to_string(tmpctx,struct amount_msat,&ce->half[dir].htlc_total));
|
type_to_string(tmpctx,struct amount_msat,&ce->half[scidd->dir].htlc_total));
|
||||||
}
|
}
|
||||||
chan_extra_can_send_(ce,dir,x);
|
chan_extra_can_send_(ce,scidd->dir,x);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update the knowledge that this (channel,direction) cannot send x msat.*/
|
/* Update the knowledge that this (channel,direction) cannot send x msat.*/
|
||||||
void chan_extra_cannot_send(
|
void chan_extra_cannot_send(
|
||||||
struct payment *p,
|
struct payment *p,
|
||||||
struct chan_extra_map *chan_extra_map,
|
struct chan_extra_map *chan_extra_map,
|
||||||
struct short_channel_id scid,
|
const struct short_channel_id_dir *scidd,
|
||||||
int dir,
|
|
||||||
struct amount_msat x)
|
struct amount_msat x)
|
||||||
{
|
{
|
||||||
struct chan_extra *ce = chan_extra_map_get(chan_extra_map,
|
struct chan_extra *ce = chan_extra_map_get(chan_extra_map,
|
||||||
scid);
|
scidd->scid);
|
||||||
if(!ce)
|
if(!ce)
|
||||||
{
|
{
|
||||||
debug_err("%s (line %d) unexpected chan_extra ce is NULL",
|
debug_err("%s (line %d) unexpected chan_extra ce is NULL",
|
||||||
|
@ -161,12 +160,12 @@ void chan_extra_cannot_send(
|
||||||
|
|
||||||
/* If a channel cannot send x it means that the upper bound for the
|
/* If a channel cannot send x it means that the upper bound for the
|
||||||
* liquidity is MAX_L < x + htlc_total */
|
* liquidity is MAX_L < x + htlc_total */
|
||||||
if(!amount_msat_add(&x,x,ce->half[dir].htlc_total))
|
if(!amount_msat_add(&x,x,ce->half[scidd->dir].htlc_total))
|
||||||
{
|
{
|
||||||
debug_err("%s (line %d) cannot add x=%s and htlc_total=%s",
|
debug_err("%s (line %d) cannot add x=%s and htlc_total=%s",
|
||||||
__PRETTY_FUNCTION__,__LINE__,
|
__PRETTY_FUNCTION__,__LINE__,
|
||||||
type_to_string(tmpctx,struct amount_msat,&x),
|
type_to_string(tmpctx,struct amount_msat,&x),
|
||||||
type_to_string(tmpctx,struct amount_msat,&ce->half[dir].htlc_total));
|
type_to_string(tmpctx,struct amount_msat,&ce->half[scidd->dir].htlc_total));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!amount_msat_sub(&x,x,AMOUNT_MSAT(1)))
|
if(!amount_msat_sub(&x,x,AMOUNT_MSAT(1)))
|
||||||
|
@ -179,23 +178,21 @@ void chan_extra_cannot_send(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we "knew" the capacity was at least this, we just showed we're wrong! */
|
/* If we "knew" the capacity was at least this, we just showed we're wrong! */
|
||||||
if (amount_msat_less_eq(x, ce->half[dir].known_min)) {
|
if (amount_msat_less_eq(x, ce->half[scidd->dir].known_min)) {
|
||||||
debug_paynote(p, "Expected scid=%s, dir=%d min %s, but %s failed! Setting min to 0",
|
debug_paynote(p, "Expected scid=%s min %s, but %s failed! Setting min to 0",
|
||||||
type_to_string(tmpctx,struct short_channel_id,&scid),
|
type_to_string(tmpctx,struct short_channel_id_dir,scidd),
|
||||||
dir,
|
type_to_string(tmpctx,struct amount_msat,&ce->half[scidd->dir].known_min),
|
||||||
type_to_string(tmpctx,struct amount_msat,&ce->half[dir].known_min),
|
|
||||||
type_to_string(tmpctx,struct amount_msat,&x));
|
type_to_string(tmpctx,struct amount_msat,&x));
|
||||||
ce->half[dir].known_min = AMOUNT_MSAT(0);
|
ce->half[scidd->dir].known_min = AMOUNT_MSAT(0);
|
||||||
}
|
}
|
||||||
ce->half[dir].known_max = amount_msat_min(ce->half[dir].known_max,x);
|
ce->half[scidd->dir].known_max = amount_msat_min(ce->half[scidd->dir].known_max,x);
|
||||||
|
|
||||||
debug_paynote(p,"Update chan knowledge scid=%s, dir=%d: [%s,%s]",
|
debug_paynote(p,"Update chan knowledge scid=%s: [%s,%s]",
|
||||||
type_to_string(tmpctx,struct short_channel_id,&scid),
|
type_to_string(tmpctx,struct short_channel_id_dir,scidd),
|
||||||
dir,
|
type_to_string(tmpctx,struct amount_msat,&ce->half[scidd->dir].known_min),
|
||||||
type_to_string(tmpctx,struct amount_msat,&ce->half[dir].known_min),
|
type_to_string(tmpctx,struct amount_msat,&ce->half[scidd->dir].known_max));
|
||||||
type_to_string(tmpctx,struct amount_msat,&ce->half[dir].known_max));
|
|
||||||
|
|
||||||
chan_extra_adjust_half(ce,!dir);
|
chan_extra_adjust_half(ce,!scidd->dir);
|
||||||
}
|
}
|
||||||
/* Update the knowledge that this (channel,direction) has liquidity x.*/
|
/* Update the knowledge that this (channel,direction) has liquidity x.*/
|
||||||
static void chan_extra_set_liquidity_(
|
static void chan_extra_set_liquidity_(
|
||||||
|
@ -220,18 +217,17 @@ static void chan_extra_set_liquidity_(
|
||||||
}
|
}
|
||||||
void chan_extra_set_liquidity(
|
void chan_extra_set_liquidity(
|
||||||
struct chan_extra_map *chan_extra_map,
|
struct chan_extra_map *chan_extra_map,
|
||||||
struct short_channel_id scid,
|
const struct short_channel_id_dir *scidd,
|
||||||
int dir,
|
|
||||||
struct amount_msat x)
|
struct amount_msat x)
|
||||||
{
|
{
|
||||||
struct chan_extra *ce = chan_extra_map_get(chan_extra_map,
|
struct chan_extra *ce = chan_extra_map_get(chan_extra_map,
|
||||||
scid);
|
scidd->scid);
|
||||||
if(!ce)
|
if(!ce)
|
||||||
{
|
{
|
||||||
debug_err("%s unexpected chan_extra ce is NULL",
|
debug_err("%s unexpected chan_extra ce is NULL",
|
||||||
__PRETTY_FUNCTION__);
|
__PRETTY_FUNCTION__);
|
||||||
}
|
}
|
||||||
chan_extra_set_liquidity_(ce,dir,x);
|
chan_extra_set_liquidity_(ce,scidd->dir,x);
|
||||||
}
|
}
|
||||||
/* Update the knowledge that this (channel,direction) has sent x msat.*/
|
/* Update the knowledge that this (channel,direction) has sent x msat.*/
|
||||||
static void chan_extra_sent_success_(
|
static void chan_extra_sent_success_(
|
||||||
|
@ -263,18 +259,17 @@ static void chan_extra_sent_success_(
|
||||||
}
|
}
|
||||||
void chan_extra_sent_success(
|
void chan_extra_sent_success(
|
||||||
struct chan_extra_map *chan_extra_map,
|
struct chan_extra_map *chan_extra_map,
|
||||||
struct short_channel_id scid,
|
const struct short_channel_id_dir *scidd,
|
||||||
int dir,
|
|
||||||
struct amount_msat x)
|
struct amount_msat x)
|
||||||
{
|
{
|
||||||
struct chan_extra *ce = chan_extra_map_get(chan_extra_map,
|
struct chan_extra *ce = chan_extra_map_get(chan_extra_map,
|
||||||
scid);
|
scidd->scid);
|
||||||
if(!ce)
|
if(!ce)
|
||||||
{
|
{
|
||||||
debug_err("%s unexpected chan_extra ce is NULL",
|
debug_err("%s unexpected chan_extra ce is NULL",
|
||||||
__PRETTY_FUNCTION__);
|
__PRETTY_FUNCTION__);
|
||||||
}
|
}
|
||||||
chan_extra_sent_success_(ce,dir,x);
|
chan_extra_sent_success_(ce,scidd->dir,x);
|
||||||
}
|
}
|
||||||
/* Forget a bit about this (channel,direction) state. */
|
/* Forget a bit about this (channel,direction) state. */
|
||||||
static void chan_extra_relax_(
|
static void chan_extra_relax_(
|
||||||
|
@ -298,19 +293,18 @@ static void chan_extra_relax_(
|
||||||
}
|
}
|
||||||
void chan_extra_relax(
|
void chan_extra_relax(
|
||||||
struct chan_extra_map *chan_extra_map,
|
struct chan_extra_map *chan_extra_map,
|
||||||
struct short_channel_id scid,
|
const struct short_channel_id_dir *scidd,
|
||||||
int dir,
|
|
||||||
struct amount_msat x,
|
struct amount_msat x,
|
||||||
struct amount_msat y)
|
struct amount_msat y)
|
||||||
{
|
{
|
||||||
struct chan_extra *ce = chan_extra_map_get(chan_extra_map,
|
struct chan_extra *ce = chan_extra_map_get(chan_extra_map,
|
||||||
scid);
|
scidd->scid);
|
||||||
if(!ce)
|
if(!ce)
|
||||||
{
|
{
|
||||||
debug_err("%s unexpected chan_extra ce is NULL",
|
debug_err("%s unexpected chan_extra ce is NULL",
|
||||||
__PRETTY_FUNCTION__);
|
__PRETTY_FUNCTION__);
|
||||||
}
|
}
|
||||||
chan_extra_relax_(ce,dir,x,y);
|
chan_extra_relax_(ce,scidd->dir,x,y);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Forget the channel information by a fraction of the capacity. */
|
/* Forget the channel information by a fraction of the capacity. */
|
||||||
|
@ -334,15 +328,14 @@ void chan_extra_relax_fraction(
|
||||||
/* Returns either NULL, or an entry from the hash */
|
/* Returns either NULL, or an entry from the hash */
|
||||||
struct chan_extra_half *
|
struct chan_extra_half *
|
||||||
get_chan_extra_half_by_scid(struct chan_extra_map *chan_extra_map,
|
get_chan_extra_half_by_scid(struct chan_extra_map *chan_extra_map,
|
||||||
const struct short_channel_id scid,
|
const struct short_channel_id_dir *scidd)
|
||||||
int dir)
|
|
||||||
{
|
{
|
||||||
struct chan_extra *ce;
|
struct chan_extra *ce;
|
||||||
|
|
||||||
ce = chan_extra_map_get(chan_extra_map, scid);
|
ce = chan_extra_map_get(chan_extra_map, scidd->scid);
|
||||||
if (!ce)
|
if (!ce)
|
||||||
return NULL;
|
return NULL;
|
||||||
return &ce->half[dir];
|
return &ce->half[scidd->dir];
|
||||||
}
|
}
|
||||||
/* Helper if we have a gossmap_chan */
|
/* Helper if we have a gossmap_chan */
|
||||||
struct chan_extra_half *
|
struct chan_extra_half *
|
||||||
|
@ -351,9 +344,11 @@ get_chan_extra_half_by_chan(const struct gossmap *gossmap,
|
||||||
const struct gossmap_chan *chan,
|
const struct gossmap_chan *chan,
|
||||||
int dir)
|
int dir)
|
||||||
{
|
{
|
||||||
return get_chan_extra_half_by_scid(chan_extra_map,
|
struct short_channel_id_dir scidd;
|
||||||
gossmap_chan_scid(gossmap, chan),
|
|
||||||
dir);
|
scidd.scid = gossmap_chan_scid(gossmap, chan);
|
||||||
|
scidd.dir = dir;
|
||||||
|
return get_chan_extra_half_by_scid(chan_extra_map, &scidd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -371,9 +366,12 @@ get_chan_extra_half_by_chan_verify(
|
||||||
int dir)
|
int dir)
|
||||||
{
|
{
|
||||||
|
|
||||||
const struct short_channel_id scid = gossmap_chan_scid(gossmap,chan);
|
struct short_channel_id_dir scidd;
|
||||||
|
|
||||||
|
scidd.scid = gossmap_chan_scid(gossmap,chan);
|
||||||
|
scidd.dir = dir;
|
||||||
struct chan_extra_half *h = get_chan_extra_half_by_scid(
|
struct chan_extra_half *h = get_chan_extra_half_by_scid(
|
||||||
chan_extra_map,scid,dir);
|
chan_extra_map,&scidd);
|
||||||
if (!h) {
|
if (!h) {
|
||||||
struct amount_sat cap;
|
struct amount_sat cap;
|
||||||
struct amount_msat cap_msat;
|
struct amount_msat cap_msat;
|
||||||
|
@ -386,7 +384,7 @@ get_chan_extra_half_by_chan_verify(
|
||||||
__PRETTY_FUNCTION__,
|
__PRETTY_FUNCTION__,
|
||||||
__LINE__);
|
__LINE__);
|
||||||
}
|
}
|
||||||
h = & new_chan_extra(chan_extra_map,scid,cap_msat)->half[dir];
|
h = & new_chan_extra(chan_extra_map,scidd.scid,cap_msat)->half[scidd.dir];
|
||||||
|
|
||||||
}
|
}
|
||||||
return h;
|
return h;
|
||||||
|
|
|
@ -148,33 +148,28 @@ static inline struct amount_msat amount_msat_max(
|
||||||
|
|
||||||
/* Update the knowledge that this (channel,direction) can send x msat.*/
|
/* Update the knowledge that this (channel,direction) can send x msat.*/
|
||||||
void chan_extra_can_send(struct chan_extra_map *chan_extra_map,
|
void chan_extra_can_send(struct chan_extra_map *chan_extra_map,
|
||||||
struct short_channel_id scid,
|
const struct short_channel_id_dir *scidd,
|
||||||
int dir,
|
|
||||||
struct amount_msat x);
|
struct amount_msat x);
|
||||||
|
|
||||||
/* Update the knowledge that this (channel,direction) cannot send x msat.*/
|
/* Update the knowledge that this (channel,direction) cannot send x msat.*/
|
||||||
void chan_extra_cannot_send(struct payment* p,
|
void chan_extra_cannot_send(struct payment* p,
|
||||||
struct chan_extra_map *chan_extra_map,
|
struct chan_extra_map *chan_extra_map,
|
||||||
struct short_channel_id scid,
|
const struct short_channel_id_dir *scidd,
|
||||||
int dir,
|
|
||||||
struct amount_msat x);
|
struct amount_msat x);
|
||||||
|
|
||||||
/* Update the knowledge that this (channel,direction) has liquidity x.*/
|
/* Update the knowledge that this (channel,direction) has liquidity x.*/
|
||||||
void chan_extra_set_liquidity(struct chan_extra_map *chan_extra_map,
|
void chan_extra_set_liquidity(struct chan_extra_map *chan_extra_map,
|
||||||
struct short_channel_id scid,
|
const struct short_channel_id_dir *scidd,
|
||||||
int dir,
|
|
||||||
struct amount_msat x);
|
struct amount_msat x);
|
||||||
|
|
||||||
/* Update the knowledge that this (channel,direction) has sent x msat.*/
|
/* Update the knowledge that this (channel,direction) has sent x msat.*/
|
||||||
void chan_extra_sent_success(struct chan_extra_map *chan_extra_map,
|
void chan_extra_sent_success(struct chan_extra_map *chan_extra_map,
|
||||||
struct short_channel_id scid,
|
const struct short_channel_id_dir *scidd,
|
||||||
int dir,
|
|
||||||
struct amount_msat x);
|
struct amount_msat x);
|
||||||
|
|
||||||
/* Forget a bit about this (channel,direction) state. */
|
/* Forget a bit about this (channel,direction) state. */
|
||||||
void chan_extra_relax(struct chan_extra_map *chan_extra_map,
|
void chan_extra_relax(struct chan_extra_map *chan_extra_map,
|
||||||
struct short_channel_id scid,
|
const struct short_channel_id_dir *scidd,
|
||||||
int dir,
|
|
||||||
struct amount_msat down,
|
struct amount_msat down,
|
||||||
struct amount_msat up);
|
struct amount_msat up);
|
||||||
|
|
||||||
|
@ -186,8 +181,7 @@ void chan_extra_relax_fraction(
|
||||||
|
|
||||||
/* Returns either NULL, or an entry from the hash */
|
/* Returns either NULL, or an entry from the hash */
|
||||||
struct chan_extra_half *get_chan_extra_half_by_scid(struct chan_extra_map *chan_extra_map,
|
struct chan_extra_half *get_chan_extra_half_by_scid(struct chan_extra_map *chan_extra_map,
|
||||||
const struct short_channel_id scid,
|
const struct short_channel_id_dir *scidd);
|
||||||
int dir);
|
|
||||||
/* If the channel is not registered, then a new entry is created. scid must be
|
/* If the channel is not registered, then a new entry is created. scid must be
|
||||||
* present in the gossmap. */
|
* present in the gossmap. */
|
||||||
struct chan_extra_half *
|
struct chan_extra_half *
|
||||||
|
|
|
@ -144,10 +144,10 @@ static struct pf_result *handle_unhandleable_error(struct pay_flow *pf,
|
||||||
/* Assume it's not the destination */
|
/* Assume it's not the destination */
|
||||||
n = pseudorand(n-1);
|
n = pseudorand(n-1);
|
||||||
|
|
||||||
tal_arr_expand(&pf->payment->disabled, pf->path_scids[n]);
|
tal_arr_expand(&pf->payment->disabled, pf->path_scidds[n].scid);
|
||||||
debug_paynote(pf->payment, "... eliminated %s",
|
debug_paynote(pf->payment, "... eliminated %s",
|
||||||
type_to_string(tmpctx, struct short_channel_id,
|
type_to_string(tmpctx, struct short_channel_id,
|
||||||
&pf->path_scids[n]));
|
&pf->path_scidds[n].scid));
|
||||||
|
|
||||||
return pay_flow_failed(pf);
|
return pay_flow_failed(pf);
|
||||||
}
|
}
|
||||||
|
@ -317,7 +317,7 @@ static struct command_result *flow_sendpay_failed(struct command *cmd,
|
||||||
|
|
||||||
/* There is no new knowledge from this kind of failure.
|
/* There is no new knowledge from this kind of failure.
|
||||||
* We just disable this scid. */
|
* We just disable this scid. */
|
||||||
tal_arr_expand(&payment->disabled, pf->path_scids[0]);
|
tal_arr_expand(&payment->disabled, pf->path_scidds[0].scid);
|
||||||
|
|
||||||
pay_flow_failed(pf);
|
pay_flow_failed(pf);
|
||||||
return command_still_pending(cmd);
|
return command_still_pending(cmd);
|
||||||
|
@ -350,11 +350,11 @@ static void sendpay_new_flows(struct payment *p)
|
||||||
json_add_node_id(req->js, "id",
|
json_add_node_id(req->js, "id",
|
||||||
&pf->path_nodes[j]);
|
&pf->path_nodes[j]);
|
||||||
json_add_short_channel_id(req->js, "channel",
|
json_add_short_channel_id(req->js, "channel",
|
||||||
&pf->path_scids[j]);
|
&pf->path_scidds[j].scid);
|
||||||
json_add_amount_msat(req->js, "amount_msat",
|
json_add_amount_msat(req->js, "amount_msat",
|
||||||
pf->amounts[j]);
|
pf->amounts[j]);
|
||||||
json_add_num(req->js, "direction",
|
json_add_num(req->js, "direction",
|
||||||
pf->path_dirs[j]);
|
pf->path_scidds[j].dir);
|
||||||
json_add_u32(req->js, "delay",
|
json_add_u32(req->js, "delay",
|
||||||
pf->cltv_delays[j]);
|
pf->cltv_delays[j]);
|
||||||
json_add_string(req->js,"style","tlv");
|
json_add_string(req->js,"style","tlv");
|
||||||
|
@ -1068,7 +1068,7 @@ static struct pf_result *handle_sendpay_failure_payment(struct pay_flow *pf STEA
|
||||||
debug_assert(p);
|
debug_assert(p);
|
||||||
|
|
||||||
/* Final node is usually a hard failure */
|
/* Final node is usually a hard failure */
|
||||||
if (erridx == tal_count(pf->path_scids)) {
|
if (erridx == tal_count(pf->path_scidds)) {
|
||||||
debug_paynote(p,
|
debug_paynote(p,
|
||||||
"onion error %s from final node #%u: %s",
|
"onion error %s from final node #%u: %s",
|
||||||
onion_wire_name(onionerr),
|
onion_wire_name(onionerr),
|
||||||
|
@ -1083,7 +1083,7 @@ static struct pf_result *handle_sendpay_failure_payment(struct pay_flow *pf STEA
|
||||||
return pay_flow_failed_final(pf, PAY_DESTINATION_PERM_FAIL, message);
|
return pay_flow_failed_final(pf, PAY_DESTINATION_PERM_FAIL, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
errscid = pf->path_scids[erridx];
|
errscid = pf->path_scidds[erridx].scid;
|
||||||
debug_paynote(p,
|
debug_paynote(p,
|
||||||
"onion error %s from node #%u %s: %s",
|
"onion error %s from node #%u %s: %s",
|
||||||
onion_wire_name(onionerr),
|
onion_wire_name(onionerr),
|
||||||
|
@ -1170,9 +1170,9 @@ static void handle_sendpay_failure_flow(struct pay_flow *pf,
|
||||||
"%s",
|
"%s",
|
||||||
onion_wire_name(onionerr),
|
onion_wire_name(onionerr),
|
||||||
erridx,
|
erridx,
|
||||||
erridx == tal_count(pf->path_scids)
|
erridx == tal_count(pf->path_scidds)
|
||||||
? "final"
|
? "final"
|
||||||
: type_to_string(tmpctx, struct short_channel_id, &pf->path_scids[erridx]),
|
: type_to_string(tmpctx, struct short_channel_id_dir, &pf->path_scidds[erridx]),
|
||||||
msg);
|
msg);
|
||||||
|
|
||||||
/* we know that all channels before erridx where able to commit to this payment */
|
/* we know that all channels before erridx where able to commit to this payment */
|
||||||
|
@ -1183,14 +1183,13 @@ static void handle_sendpay_failure_flow(struct pay_flow *pf,
|
||||||
|
|
||||||
/* Insufficient funds (not from final, that's weird!) */
|
/* Insufficient funds (not from final, that's weird!) */
|
||||||
if((enum onion_wire)onionerr == WIRE_TEMPORARY_CHANNEL_FAILURE
|
if((enum onion_wire)onionerr == WIRE_TEMPORARY_CHANNEL_FAILURE
|
||||||
&& erridx < tal_count(pf->path_scids))
|
&& erridx < tal_count(pf->path_scidds))
|
||||||
{
|
{
|
||||||
plugin_log(pay_plugin->plugin,LOG_DBG,
|
plugin_log(pay_plugin->plugin,LOG_DBG,
|
||||||
"sendpay_failure says insufficient funds!");
|
"sendpay_failure says insufficient funds!");
|
||||||
|
|
||||||
chan_extra_cannot_send(p,pay_plugin->chan_extra_map,
|
chan_extra_cannot_send(p,pay_plugin->chan_extra_map,
|
||||||
pf->path_scids[erridx],
|
&pf->path_scidds[erridx],
|
||||||
pf->path_dirs[erridx],
|
|
||||||
/* This channel can't send all that was
|
/* This channel can't send all that was
|
||||||
* commited in HTLCs.
|
* commited in HTLCs.
|
||||||
* Had we removed the commited amount then
|
* Had we removed the commited amount then
|
||||||
|
@ -1300,10 +1299,10 @@ static struct pf_result *sendpay_failure(struct pay_flow *pf,
|
||||||
return handle_unhandleable_error(pf, err);
|
return handle_unhandleable_error(pf, err);
|
||||||
|
|
||||||
/* Answer must be sane: but note, erridx can be final node! */
|
/* Answer must be sane: but note, erridx can be final node! */
|
||||||
if (erridx > tal_count(pf->path_scids)) {
|
if (erridx > tal_count(pf->path_scidds)) {
|
||||||
plugin_err(pay_plugin->plugin,
|
plugin_err(pay_plugin->plugin,
|
||||||
"Erring channel %u/%zu in path %s",
|
"Erring channel %u/%zu in path %s",
|
||||||
erridx, tal_count(pf->path_scids),
|
erridx, tal_count(pf->path_scidds),
|
||||||
flow_path_to_str(tmpctx, pf));
|
flow_path_to_str(tmpctx, pf));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,11 +38,10 @@ static void remove_htlc_payflow(
|
||||||
struct chan_extra_map *chan_extra_map,
|
struct chan_extra_map *chan_extra_map,
|
||||||
struct pay_flow *pf)
|
struct pay_flow *pf)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < tal_count(pf->path_scids); i++) {
|
for (size_t i = 0; i < tal_count(pf->path_scidds); i++) {
|
||||||
struct chan_extra_half *h = get_chan_extra_half_by_scid(
|
struct chan_extra_half *h = get_chan_extra_half_by_scid(
|
||||||
chan_extra_map,
|
chan_extra_map,
|
||||||
pf->path_scids[i],
|
&pf->path_scidds[i]);
|
||||||
pf->path_dirs[i]);
|
|
||||||
if(!h)
|
if(!h)
|
||||||
{
|
{
|
||||||
plugin_err(pay_plugin->plugin,
|
plugin_err(pay_plugin->plugin,
|
||||||
|
@ -74,11 +73,10 @@ static void commit_htlc_payflow(
|
||||||
struct chan_extra_map *chan_extra_map,
|
struct chan_extra_map *chan_extra_map,
|
||||||
const struct pay_flow *pf)
|
const struct pay_flow *pf)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < tal_count(pf->path_scids); i++) {
|
for (size_t i = 0; i < tal_count(pf->path_scidds); i++) {
|
||||||
struct chan_extra_half *h = get_chan_extra_half_by_scid(
|
struct chan_extra_half *h = get_chan_extra_half_by_scid(
|
||||||
chan_extra_map,
|
chan_extra_map,
|
||||||
pf->path_scids[i],
|
&pf->path_scidds[i]);
|
||||||
pf->path_dirs[i]);
|
|
||||||
if(!h)
|
if(!h)
|
||||||
{
|
{
|
||||||
plugin_err(pay_plugin->plugin,
|
plugin_err(pay_plugin->plugin,
|
||||||
|
@ -288,14 +286,15 @@ static void convert_and_attach_flows(struct payment *payment,
|
||||||
pf->key.payment_hash = payment->payment_hash;
|
pf->key.payment_hash = payment->payment_hash;
|
||||||
|
|
||||||
/* Convert gossmap_chan into scids and nodes */
|
/* Convert gossmap_chan into scids and nodes */
|
||||||
pf->path_scids = tal_arr(pf, struct short_channel_id, plen);
|
pf->path_scidds = tal_arr(pf, struct short_channel_id_dir, plen);
|
||||||
pf->path_nodes = tal_arr(pf, struct node_id, plen);
|
pf->path_nodes = tal_arr(pf, struct node_id, plen);
|
||||||
for (size_t j = 0; j < plen; j++) {
|
for (size_t j = 0; j < plen; j++) {
|
||||||
struct gossmap_node *n;
|
struct gossmap_node *n;
|
||||||
n = gossmap_nth_node(gossmap, f->path[j], !f->dirs[j]);
|
n = gossmap_nth_node(gossmap, f->path[j], !f->dirs[j]);
|
||||||
gossmap_node_get_id(gossmap, n, &pf->path_nodes[j]);
|
gossmap_node_get_id(gossmap, n, &pf->path_nodes[j]);
|
||||||
pf->path_scids[j]
|
pf->path_scidds[j].scid
|
||||||
= gossmap_chan_scid(gossmap, f->path[j]);
|
= gossmap_chan_scid(gossmap, f->path[j]);
|
||||||
|
pf->path_scidds[j].dir = f->dirs[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Calculate cumulative delays (backwards) */
|
/* Calculate cumulative delays (backwards) */
|
||||||
|
@ -306,7 +305,6 @@ static void convert_and_attach_flows(struct payment *payment,
|
||||||
+ f->path[j]->half[f->dirs[j]].delay;
|
+ f->path[j]->half[f->dirs[j]].delay;
|
||||||
}
|
}
|
||||||
pf->amounts = tal_steal(pf, f->amounts);
|
pf->amounts = tal_steal(pf, f->amounts);
|
||||||
pf->path_dirs = tal_steal(pf, f->dirs);
|
|
||||||
pf->success_prob = f->success_prob;
|
pf->success_prob = f->success_prob;
|
||||||
|
|
||||||
/* Payment keeps a list of its flows. */
|
/* Payment keeps a list of its flows. */
|
||||||
|
@ -539,10 +537,10 @@ const char *add_payflows(const tal_t *ctx,
|
||||||
const char *flow_path_to_str(const tal_t *ctx, const struct pay_flow *flow)
|
const char *flow_path_to_str(const tal_t *ctx, const struct pay_flow *flow)
|
||||||
{
|
{
|
||||||
char *s = tal_strdup(ctx, "");
|
char *s = tal_strdup(ctx, "");
|
||||||
for (size_t i = 0; i < tal_count(flow->path_scids); i++) {
|
for (size_t i = 0; i < tal_count(flow->path_scidds); i++) {
|
||||||
tal_append_fmt(&s, "-%s->",
|
tal_append_fmt(&s, "-%s->",
|
||||||
type_to_string(tmpctx, struct short_channel_id,
|
type_to_string(tmpctx, struct short_channel_id,
|
||||||
&flow->path_scids[i]));
|
&flow->path_scidds[i].scid));
|
||||||
}
|
}
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,9 +50,8 @@ struct pay_flow {
|
||||||
} key;
|
} key;
|
||||||
|
|
||||||
/* The series of channels and nodes to traverse. */
|
/* The series of channels and nodes to traverse. */
|
||||||
struct short_channel_id *path_scids;
|
struct short_channel_id_dir *path_scidds;
|
||||||
struct node_id *path_nodes;
|
struct node_id *path_nodes;
|
||||||
int *path_dirs;
|
|
||||||
/* CLTV delays for each hop */
|
/* CLTV delays for each hop */
|
||||||
u32 *cltv_delays;
|
u32 *cltv_delays;
|
||||||
/* The amounts at each step */
|
/* The amounts at each step */
|
||||||
|
|
|
@ -188,12 +188,11 @@ void uncertainty_network_flow_success(
|
||||||
struct chan_extra_map *chan_extra_map,
|
struct chan_extra_map *chan_extra_map,
|
||||||
struct pay_flow *pf)
|
struct pay_flow *pf)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < tal_count(pf->path_scids); i++)
|
for (size_t i = 0; i < tal_count(pf->path_scidds); i++)
|
||||||
{
|
{
|
||||||
chan_extra_sent_success(
|
chan_extra_sent_success(
|
||||||
chan_extra_map,
|
chan_extra_map,
|
||||||
pf->path_scids[i],
|
&pf->path_scidds[i],
|
||||||
pf->path_dirs[i],
|
|
||||||
pf->amounts[i]);
|
pf->amounts[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -207,9 +206,7 @@ void uncertainty_network_channel_can_send(
|
||||||
for (size_t i = 0; i < erridx; i++)
|
for (size_t i = 0; i < erridx; i++)
|
||||||
{
|
{
|
||||||
chan_extra_can_send(chan_extra_map,
|
chan_extra_can_send(chan_extra_map,
|
||||||
pf->path_scids[i],
|
&pf->path_scidds[i],
|
||||||
pf->path_dirs[i],
|
|
||||||
|
|
||||||
/* This channel can send all that was
|
/* This channel can send all that was
|
||||||
* commited in HTLCs.
|
* commited in HTLCs.
|
||||||
* Had we removed the commited amount then
|
* Had we removed the commited amount then
|
||||||
|
@ -238,14 +235,14 @@ bool uncertainty_network_update_from_listpeerchannels(
|
||||||
goto malformed;
|
goto malformed;
|
||||||
|
|
||||||
json_for_each_arr(i, channel, channels) {
|
json_for_each_arr(i, channel, channels) {
|
||||||
struct short_channel_id scid;
|
struct short_channel_id_dir scidd;
|
||||||
const jsmntok_t *scidtok = json_get_member(buf, channel, "short_channel_id");
|
const jsmntok_t *scidtok = json_get_member(buf, channel, "short_channel_id");
|
||||||
/* If channel is still opening, this won't be there.
|
/* If channel is still opening, this won't be there.
|
||||||
* Also it won't be in the gossmap, so there is
|
* Also it won't be in the gossmap, so there is
|
||||||
* no need to mark it as disabled. */
|
* no need to mark it as disabled. */
|
||||||
if (!scidtok)
|
if (!scidtok)
|
||||||
continue;
|
continue;
|
||||||
if (!json_to_short_channel_id(buf, scidtok, &scid))
|
if (!json_to_short_channel_id(buf, scidtok, &scidd.scid))
|
||||||
goto malformed;
|
goto malformed;
|
||||||
|
|
||||||
bool connected;
|
bool connected;
|
||||||
|
@ -259,15 +256,14 @@ bool uncertainty_network_update_from_listpeerchannels(
|
||||||
" peer disconnected",
|
" peer disconnected",
|
||||||
type_to_string(tmpctx,
|
type_to_string(tmpctx,
|
||||||
struct short_channel_id,
|
struct short_channel_id,
|
||||||
&scid));
|
&scidd.scid));
|
||||||
tal_arr_expand(&p->disabled, scid);
|
tal_arr_expand(&p->disabled, scidd.scid);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const jsmntok_t *spendabletok, *dirtok,*statetok, *totaltok,
|
const jsmntok_t *spendabletok, *dirtok,*statetok, *totaltok,
|
||||||
*peeridtok;
|
*peeridtok;
|
||||||
struct amount_msat spendable,capacity;
|
struct amount_msat spendable,capacity;
|
||||||
int dir;
|
|
||||||
|
|
||||||
const struct node_id src=my_id;
|
const struct node_id src=my_id;
|
||||||
struct node_id dst;
|
struct node_id dst;
|
||||||
|
@ -285,7 +281,7 @@ bool uncertainty_network_update_from_listpeerchannels(
|
||||||
goto malformed;
|
goto malformed;
|
||||||
if (!json_to_msat(buf, totaltok, &capacity))
|
if (!json_to_msat(buf, totaltok, &capacity))
|
||||||
goto malformed;
|
goto malformed;
|
||||||
if (!json_to_int(buf, dirtok,&dir))
|
if (!json_to_int(buf, dirtok, &scidd.dir))
|
||||||
goto malformed;
|
goto malformed;
|
||||||
if(!json_to_node_id(buf,peeridtok,&dst))
|
if(!json_to_node_id(buf,peeridtok,&dst))
|
||||||
goto malformed;
|
goto malformed;
|
||||||
|
@ -293,24 +289,24 @@ bool uncertainty_network_update_from_listpeerchannels(
|
||||||
/* Don't report opening/closing channels */
|
/* Don't report opening/closing channels */
|
||||||
if (!json_tok_streq(buf, statetok, "CHANNELD_NORMAL")
|
if (!json_tok_streq(buf, statetok, "CHANNELD_NORMAL")
|
||||||
&& !json_tok_streq(buf, statetok, "CHANNELD_AWAITING_SPLICE")) {
|
&& !json_tok_streq(buf, statetok, "CHANNELD_AWAITING_SPLICE")) {
|
||||||
tal_arr_expand(&p->disabled, scid);
|
tal_arr_expand(&p->disabled, scidd.scid);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct chan_extra *ce = chan_extra_map_get(chan_extra_map,
|
struct chan_extra *ce = chan_extra_map_get(chan_extra_map,
|
||||||
scid);
|
scidd.scid);
|
||||||
|
|
||||||
if(!ce)
|
if(!ce)
|
||||||
{
|
{
|
||||||
/* this channel is not public, but it belongs to us */
|
/* this channel is not public, but it belongs to us */
|
||||||
ce = new_chan_extra(chan_extra_map,
|
ce = new_chan_extra(chan_extra_map,
|
||||||
scid,
|
scidd.scid,
|
||||||
capacity);
|
capacity);
|
||||||
/* FIXME: features? */
|
/* FIXME: features? */
|
||||||
gossmap_local_addchan(p->local_gossmods,
|
gossmap_local_addchan(p->local_gossmods,
|
||||||
&src, &dst, &scid, NULL);
|
&src, &dst, &scidd.scid, NULL);
|
||||||
gossmap_local_updatechan(p->local_gossmods,
|
gossmap_local_updatechan(p->local_gossmods,
|
||||||
&scid,
|
&scidd.scid,
|
||||||
|
|
||||||
/* TODO(eduardo): does it
|
/* TODO(eduardo): does it
|
||||||
* matter to consider HTLC
|
* matter to consider HTLC
|
||||||
|
@ -323,14 +319,14 @@ bool uncertainty_network_update_from_listpeerchannels(
|
||||||
* matter to set this delay? */
|
* matter to set this delay? */
|
||||||
/*delay=*/0,
|
/*delay=*/0,
|
||||||
true,
|
true,
|
||||||
dir);
|
scidd.dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(eduardo): this includes pending HTLC of previous
|
// TODO(eduardo): this includes pending HTLC of previous
|
||||||
// payments!
|
// payments!
|
||||||
/* We know min and max liquidity exactly now! */
|
/* We know min and max liquidity exactly now! */
|
||||||
chan_extra_set_liquidity(chan_extra_map,
|
chan_extra_set_liquidity(chan_extra_map,
|
||||||
scid,dir,spendable);
|
&scidd,spendable);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue