mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-01-18 05:12:45 +01:00
gossipd: work around LND reply_channel_range.
We've been sending them errors for invalid replies; instead, this works around it. Changelog-Added: Workaround LND's reply_channel_range issues instead of sending error. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
14a5584b50
commit
6e433e0108
@ -720,23 +720,34 @@ const u8 *handle_reply_channel_range(struct peer *peer, const u8 *msg)
|
|||||||
if (end > peer->range_end_blocknum)
|
if (end > peer->range_end_blocknum)
|
||||||
end = peer->range_end_blocknum;
|
end = peer->range_end_blocknum;
|
||||||
|
|
||||||
/* We keep a bitmap of what blocks have been covered by replies: bit 0
|
/* LND mis-implemented the spec. If they have multiple replies, set
|
||||||
* represents block peer->range_first_blocknum */
|
* each one to the *whole* range, with complete=0 except the last.
|
||||||
b = bitmap_ffs(peer->query_channel_blocks,
|
* Try to accomodate that (pretend we make no progress until the
|
||||||
start - peer->range_first_blocknum,
|
* end)! */
|
||||||
end - peer->range_first_blocknum);
|
if (first_blocknum == peer->range_first_blocknum
|
||||||
if (b != end - peer->range_first_blocknum) {
|
&& first_blocknum + number_of_blocks == peer->range_end_blocknum
|
||||||
return towire_errorfmt(peer, NULL,
|
&& !complete
|
||||||
"reply_channel_range %u+%u already have block %lu",
|
&& tal_bytelen(msg) == 64046) {
|
||||||
first_blocknum, number_of_blocks,
|
status_debug("LND reply_channel_range detected: futzing");
|
||||||
peer->range_first_blocknum + b);
|
} else {
|
||||||
}
|
/* We keep a bitmap of what blocks have been covered by replies: bit 0
|
||||||
|
* represents block peer->range_first_blocknum */
|
||||||
|
b = bitmap_ffs(peer->query_channel_blocks,
|
||||||
|
start - peer->range_first_blocknum,
|
||||||
|
end - peer->range_first_blocknum);
|
||||||
|
if (b != end - peer->range_first_blocknum) {
|
||||||
|
return towire_errorfmt(peer, NULL,
|
||||||
|
"reply_channel_range %u+%u already have block %lu",
|
||||||
|
first_blocknum, number_of_blocks,
|
||||||
|
peer->range_first_blocknum + b);
|
||||||
|
}
|
||||||
|
|
||||||
/* Mark that short_channel_ids for this block have been received */
|
/* Mark that short_channel_ids for this block have been received */
|
||||||
bitmap_fill_range(peer->query_channel_blocks,
|
bitmap_fill_range(peer->query_channel_blocks,
|
||||||
start - peer->range_first_blocknum,
|
start - peer->range_first_blocknum,
|
||||||
end - peer->range_first_blocknum);
|
end - peer->range_first_blocknum);
|
||||||
peer->range_blocks_remaining -= end - start;
|
peer->range_blocks_remaining -= end - start;
|
||||||
|
}
|
||||||
|
|
||||||
/* Add scids */
|
/* Add scids */
|
||||||
n = tal_count(peer->query_channel_scids);
|
n = tal_count(peer->query_channel_scids);
|
||||||
|
Loading…
Reference in New Issue
Block a user