mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-01-18 13:25:43 +01:00
gossipd: handle query_short_channel_ids message.
This doesn't handle zlib yet. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
32c39c2979
commit
7ee5da858c
107
gossipd/gossip.c
107
gossipd/gossip.c
@ -694,6 +694,105 @@ static u8 *handle_gossip_msg(struct daemon *daemon, const u8 *msg,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* BOLT #7:
|
||||||
|
*
|
||||||
|
* the first byte indicates the encoding, the rest contains the data.
|
||||||
|
*
|
||||||
|
* Encoding types:
|
||||||
|
* * `0`: uncompressed array of `short_channel_id` types, in ascending order.
|
||||||
|
*/
|
||||||
|
static struct short_channel_id *decode_short_ids(const tal_t *ctx,
|
||||||
|
const u8 *encoded)
|
||||||
|
{
|
||||||
|
struct short_channel_id *scids;
|
||||||
|
size_t max = tal_len(encoded), n;
|
||||||
|
u8 type;
|
||||||
|
|
||||||
|
/* BOLT #7:
|
||||||
|
*
|
||||||
|
* The receiver:
|
||||||
|
* - if the first byte of `encoded_short_ids` is not zero:
|
||||||
|
* - MAY fail the connection
|
||||||
|
* - if `encoded_short_ids` does not decode into a whole number of
|
||||||
|
* `short_channel_id`:
|
||||||
|
* - MAY fail the connection
|
||||||
|
*/
|
||||||
|
type = fromwire_u8(&encoded, &max);
|
||||||
|
if (type != 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
n = 0;
|
||||||
|
scids = tal_arr(ctx, struct short_channel_id, n);
|
||||||
|
while (max) {
|
||||||
|
tal_resize(&scids, n+1);
|
||||||
|
fromwire_short_channel_id(&encoded, &max, &scids[n++]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* encoded is set to NULL if we ran over */
|
||||||
|
if (!encoded)
|
||||||
|
return tal_free(scids);
|
||||||
|
return scids;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handle_query_short_channel_ids(struct peer *peer, u8 *msg)
|
||||||
|
{
|
||||||
|
struct routing_state *rstate =peer->daemon->rstate;
|
||||||
|
struct bitcoin_blkid chain;
|
||||||
|
u8 *encoded;
|
||||||
|
struct short_channel_id *scids;
|
||||||
|
|
||||||
|
if (!fromwire_query_short_channel_ids(tmpctx, msg, &chain, &encoded)) {
|
||||||
|
peer_error(peer, "Bad query_short_channel_ids %s",
|
||||||
|
tal_hex(tmpctx, msg));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!structeq(&rstate->chain_hash, &chain)) {
|
||||||
|
status_trace("%s sent query_short_channel_ids chainhash %s",
|
||||||
|
type_to_string(tmpctx, struct pubkey, &peer->id),
|
||||||
|
type_to_string(tmpctx, struct bitcoin_blkid, &chain));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* BOLT #7:
|
||||||
|
*
|
||||||
|
* - if it has not sent `reply_short_channel_ids_end` to a
|
||||||
|
* previously received `query_short_channel_ids` from this
|
||||||
|
* sender:
|
||||||
|
* - MAY fail the connection.
|
||||||
|
*/
|
||||||
|
if (peer->scid_queries || peer->scid_query_nodes) {
|
||||||
|
peer_error(peer, "Bad second query_short_channel_ids");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
scids = decode_short_ids(tmpctx, encoded);
|
||||||
|
if (!scids) {
|
||||||
|
peer_error(peer, "Bad query_short_channel_ids encoding %s",
|
||||||
|
tal_hex(tmpctx, encoded));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* BOLT #7:
|
||||||
|
*
|
||||||
|
* - SHOULD respond to each known `short_channel_id` with a
|
||||||
|
* `channel_announce` and the latest `channel_update`s for each end
|
||||||
|
* - SHOULD NOT wait for the next outgoing announcement flush to send
|
||||||
|
* these.
|
||||||
|
*/
|
||||||
|
peer->scid_queries = tal_steal(peer, scids);
|
||||||
|
peer->scid_query_idx = 0;
|
||||||
|
peer->scid_query_nodes = tal_arr(peer, struct pubkey, 0);
|
||||||
|
|
||||||
|
/* Wake writer. */
|
||||||
|
if (peer->local)
|
||||||
|
/* Notify the peer-write loop */
|
||||||
|
msg_wake(&peer->local->peer_out);
|
||||||
|
else
|
||||||
|
/* Notify the daemon_conn-write loop */
|
||||||
|
msg_wake(&peer->remote->out);
|
||||||
|
}
|
||||||
|
|
||||||
static void handle_ping(struct peer *peer, u8 *ping)
|
static void handle_ping(struct peer *peer, u8 *ping)
|
||||||
{
|
{
|
||||||
u8 *pong;
|
u8 *pong;
|
||||||
@ -800,6 +899,10 @@ static struct io_plan *peer_msgin(struct io_conn *conn,
|
|||||||
handle_pong(peer, msg);
|
handle_pong(peer, msg);
|
||||||
return peer_next_in(conn, peer);
|
return peer_next_in(conn, peer);
|
||||||
|
|
||||||
|
case WIRE_QUERY_SHORT_CHANNEL_IDS:
|
||||||
|
handle_query_short_channel_ids(peer, msg);
|
||||||
|
return peer_next_in(conn, peer);
|
||||||
|
|
||||||
case WIRE_OPEN_CHANNEL:
|
case WIRE_OPEN_CHANNEL:
|
||||||
case WIRE_CHANNEL_REESTABLISH:
|
case WIRE_CHANNEL_REESTABLISH:
|
||||||
case WIRE_ACCEPT_CHANNEL:
|
case WIRE_ACCEPT_CHANNEL:
|
||||||
@ -824,7 +927,6 @@ static struct io_plan *peer_msgin(struct io_conn *conn,
|
|||||||
/* This will wait. */
|
/* This will wait. */
|
||||||
return peer_next_in(conn, peer);
|
return peer_next_in(conn, peer);
|
||||||
|
|
||||||
case WIRE_QUERY_SHORT_CHANNEL_IDS:
|
|
||||||
case WIRE_REPLY_SHORT_CHANNEL_IDS_END:
|
case WIRE_REPLY_SHORT_CHANNEL_IDS_END:
|
||||||
case WIRE_QUERY_CHANNEL_RANGE:
|
case WIRE_QUERY_CHANNEL_RANGE:
|
||||||
case WIRE_REPLY_CHANNEL_RANGE:
|
case WIRE_REPLY_CHANNEL_RANGE:
|
||||||
@ -1232,7 +1334,8 @@ static struct io_plan *owner_msg_in(struct io_conn *conn,
|
|||||||
err = handle_gossip_msg(peer->daemon, dc->msg_in, "subdaemon");
|
err = handle_gossip_msg(peer->daemon, dc->msg_in, "subdaemon");
|
||||||
if (err)
|
if (err)
|
||||||
queue_peer_msg(peer, take(err));
|
queue_peer_msg(peer, take(err));
|
||||||
|
} else if (type == WIRE_QUERY_SHORT_CHANNEL_IDS) {
|
||||||
|
handle_query_short_channel_ids(peer, dc->msg_in);
|
||||||
} else if (type == WIRE_GOSSIP_GET_UPDATE) {
|
} else if (type == WIRE_GOSSIP_GET_UPDATE) {
|
||||||
handle_get_update(peer, dc->msg_in);
|
handle_get_update(peer, dc->msg_in);
|
||||||
} else if (type == WIRE_GOSSIP_LOCAL_ADD_CHANNEL) {
|
} else if (type == WIRE_GOSSIP_LOCAL_ADD_CHANNEL) {
|
||||||
|
Loading…
Reference in New Issue
Block a user